«1. Обзор

В предыдущей статье под названием «Введение в Spring Remoting с HTTP Invokers» мы увидели, как легко настроить клиент-серверное приложение, использующее удаленный вызов методов (RMI) через Spring Remoting.

В этой статье мы покажем, как Spring Remoting поддерживает реализацию RMI с использованием вместо этого Hessian и Burlap.

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

Как Hessian, так и Burlap предоставляются следующей библиотекой, которую необходимо явно включить в файл pom.xml:

<dependency>
    <groupId>com.caucho</groupId>
    <artifactId>hessian</artifactId>
    <version>4.0.38</version>
</dependency>

Последнюю версию можно найти на Maven Central.

3. Hessian

Hessian — это облегченный двоичный протокол от Caucho, создателей сервера приложений Resin. Реализации Hessian существуют для нескольких платформ и языков, включая Java.

В следующих подразделах мы изменим пример «заказа такси», представленный в предыдущей статье, чтобы заставить клиент и сервер обмениваться данными с использованием Hessian вместо протокола Spring Remote на основе HTTP.

3.1. Предоставление службы

Давайте представим службу, настроив RemoteExporter типа HessianServiceExporter, заменив ранее использовавшийся HttpInvokerServiceExporter:

@Bean(name = "/booking") 
RemoteExporter bookingService() {
    HessianServiceExporter exporter = new HessianServiceExporter();
    exporter.setService(new CabBookingServiceImpl());
    exporter.setServiceInterface( CabBookingService.class );
    return exporter;
}

Теперь мы можем запустить сервер и оставить его активным, пока мы готовим клиент.

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

Давайте реализуем клиент. Здесь снова изменения довольно просты — нам нужно заменить HttpInvokerProxyFactoryBean на HessianProxyFactoryBean:

@Configuration
public class HessianClient {

    @Bean
    public HessianProxyFactoryBean hessianInvoker() {
        HessianProxyFactoryBean invoker = new HessianProxyFactoryBean();
        invoker.setServiceUrl("http://localhost:8080/booking");
        invoker.setServiceInterface(CabBookingService.class);
        return invoker;
    }

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

Давайте теперь запустим клиент, чтобы подключить его к серверу с помощью Hessian.

4. Burlap

Burlap — еще один облегченный протокол от Caucho, основанный на XML. Caucho давно прекратил его поддержку, и по этой причине его поддержка устарела в новейших выпусках Spring, хотя она уже присутствует.

Поэтому разумно продолжать использовать Burlap только в том случае, если у вас есть приложения, которые уже распределены и которые нельзя легко перенести в другую реализацию Spring Remoting.

4.1. Предоставление сервиса

Мы можем использовать Burlap точно так же, как мы использовали Hessian — нам просто нужно выбрать правильную реализацию:

@Bean(name = "/booking") 
RemoteExporter burlapService() {
    BurlapServiceExporter exporter = new BurlapServiceExporter();
    exporter.setService(new CabBookingServiceImpl());
    exporter.setServiceInterface( CabBookingService.class );
    return exporter;
}

Как видите, мы просто изменили тип экспортера с HessianServiceExporter в BurlapServiceExporter. Весь код настройки можно оставить без изменений.

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

4.2. Реализация клиента

Мы также можем заменить Hessian на Burlap на стороне клиента, заменив HessianProxyFactoryBean на BurlapProxyFactoryBean:

@Bean
public BurlapProxyFactoryBean burlapInvoker() {
    BurlapProxyFactoryBean invoker = new BurlapProxyFactoryBean();
    invoker.setServiceUrl("http://localhost:8080/booking");
    invoker.setServiceInterface(CabBookingService.class);
    return invoker;
}

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

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

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

Как обычно, вы найдете исходники на GitHub с клиентами для Hessian и Burlap, а также тест JUnit CabBookingServiceTest.java, который позаботится о запуске как сервера, так и клиентов.