Spring Remoting с RMI

Spring Remoting с RMI

1. обзор

JavaRemote Method Invocation позволяет вызывать объект, находящийся в другомJava Virtual Machine. Это хорошо зарекомендовавшая себя технология, но немного громоздкая в использовании, как мы можем видеть вofficial Oracle trail, посвященном этой теме.

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

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

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

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

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

Теперь перейдем к обычному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-компонент, реализующий интерфейс. Это bean-компонент, который фактически выполняет бизнес-логику на сервере:

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

Давайте продолжим декларироватьExporter, которые делают сервис доступным для клиентов. В этом случае мы будем использовать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() мы предоставляем ссылку на интерфейс, который будет доступен для удаленного вызова.

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

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

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

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

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

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

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

@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, которое в противном случае потребовало бы ряда утомительных задач, таких как, среди прочего, развертывание реестра и определение служб с использованием интерфейсов, которые делают интенсивное использование проверенных исключений.

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