Рубрики
Без рубрики

Пружинное дистанционное управление с помощью RMI

Быстрый и практичный пример Java RMI с Spring.

Автор оригинала: baeldung.

1. Обзор

Java Вызов удаленного метода позволяет вызвать объект, находящийся в другой виртуальной машине Java . Это хорошо зарекомендовавшая себя технология, но немного громоздкая в использовании, как мы можем видеть в официальном следе Oracle , посвященном этой теме.

В этой краткой статье мы рассмотрим, как Spring Remoting позволяет использовать RMI более простым и чистым способом.

Эта статья также завершает обзор Spring Remoting . Вы можете найти подробную информацию о других поддерживаемых технологиях в предыдущих частях: HTTP Invokers , JMS , AMQP , Hessian и Burlap .

2. Зависимости Maven

Как и в предыдущих статьях, мы настроим несколько приложений Spring Boot : сервер, предоставляющий удаленный вызываемый объект, и клиент, вызывающий открытую службу.

Все, что нам нужно, находится в spring-context jar – так что мы можем принести его с помощью любого Spring Boot helper, который мы предпочитаем, потому что наша главная цель – просто иметь доступные основные библиотеки.

Теперь давайте перейдем к обычному spring-boot-starter-web – не забывая удалить зависимость Tomcat , чтобы исключить встроенный веб-сервис:


    org.springframework.boot
    spring-boot-starter-web
    
        
            org.springframework.boot
            spring-boot-starter-tomcat
        
    

3. Серверное приложение

Мы начнем объявлять интерфейс, который определяет сервис для заказа поездки на такси, который в конечном итоге будет доступен клиентам:

public interface CabBookingService {
    Booking bookRide(String pickUpLocation) throws BookingException;
}

Затем мы определим боб, который реализует интерфейс. Это боб, который фактически будет выполнять бизнес-логику на сервере:

@Bean 
CabBookingService bookingService() {
    return new CabBookingServiceImpl();
}

Давайте продолжим декларировать Экспортер , который делает сервис доступным для клиентов. В этом случае мы будем использовать RmiServiceExporter :

@Bean 
RmiServiceExporter exporter(CabBookingService implementation) {
    Class serviceInterface = CabBookingService.class;
    RmiServiceExporter exporter = new RmiServiceExporter();
    exporter.setServiceInterface(serviceInterface);
    exporter.setService(implementation);
    exporter.setServiceName(serviceInterface.getSimpleName());
    exporter.setRegistryPort(1099); 
    return exporter;
}

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

Мы также должны предоставить ссылку на объект, фактически выполняющий метод с помощью set Service() . Затем мы могли бы предоставить порт реестра RMI , доступный на машине, где работает сервер, если мы не хотим использовать порт по умолчанию 1099.

Мы также должны установить имя службы, позволяющее идентифицировать выставленную службу в реестре RMI .

С данной конфигурацией клиент сможет связаться со Службой бронирования такси по следующему АДРЕСУ: rmi://HOST:1199/CabBookingService .

Давайте, наконец, запустим сервер. Нам даже не нужно запускать реестр RMI самостоятельно, потому что Spring сделает это автоматически для нас, если такой реестр недоступен.

4. Клиентское приложение

Давайте теперь напишем клиентское приложение.

Мы начинаем объявлять RmiProxyFactoryBean , который создаст боб, имеющий тот же интерфейс, который предоставляет служба, работающая на стороне сервера, и который будет прозрачно направлять вызовы, которые она получит на сервер:

@Bean 
RmiProxyFactoryBean service() {
    RmiProxyFactoryBean rmiProxyFactory = new RmiProxyFactoryBean();
    rmiProxyFactory.setServiceUrl("rmi://localhost:1099/CabBookingService");
    rmiProxyFactory.setServiceInterface(CabBookingService.class);
    return rmiProxyFactory;
}

Затем давайте напишем простой код, который запускает клиентское приложение и использует прокси-сервер, определенный на предыдущем шаге:

public static void main(String[] args) throws BookingException {
    CabBookingService service = SpringApplication
      .run(RmiClient.class, args).getBean(CabBookingService.class);
    Booking bookingOutcome = service
      .bookRide("13 Seagate Blvd, Key Largo, FL 33037");
    System.out.println(bookingOutcome);
}

Теперь достаточно запустить клиент, чтобы убедиться, что он вызывает службу, предоставленную сервером.

5. Заключение

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

Как обычно, вы найдете исходники на GitHub.