1概要

JavaのRemoteメソッドInvocationによって、別のJava仮想マシンに存在するオブジェクトを呼び出すことができます。このテーマ専用のhttp://docs.oracle.com/javase/tutorial/rmi/index.html[オフィシャルオラクルトレイル]をご覧ください。

この簡単な記事では、

Spring Remoting

がどのように

RMI

をより簡単でわかりやすい方法で活用できるようにするかを探ります。

この記事では、

Spring Remoting

の概要についても説明します。サポートされているその他のテクノロジの詳細については、前回の記事で説明しています。]、

ヘッシアンとバーラップ


2 Mavenの依存関係

前回の記事で行ったように、リモート呼び出し可能オブジェクトを公開するサーバーと公開サービスを呼び出すクライアントの2つの

Spring Boot

アプリケーションをセットアップします。

必要なものはすべて

spring-context

jarファイルに入っています。したがって、私たちの主な目標はメインのライブラリを利用できるようにすることだけなので、必要なものはすべて使用できます。

それでは、通常の

spring-boot-starter-web

を見てみましょう。組み込みWebサービスを除外するために

Tomcat

依存関係を削除することを忘れないでください。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>


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<CabBookingService> serviceInterface = CabBookingService.class;
    RmiServiceExporter exporter = new RmiServiceExporter();
    exporter.setServiceInterface(serviceInterface);
    exporter.setService(implementation);
    exporter.setServiceName(serviceInterface.getSimpleName());
    exporter.setRegistryPort(1099);
    return exporter;
}


setServiceInterface()

を通じて、リモートで呼び出し可能にするインタフェースへの参照を提供します。

また、実際にメソッドを実行しているオブジェクトへの参照を

setService()

で提供する必要があります。デフォルトのポート1099を使用したくない場合は、サーバーが稼働しているマシンで利用可能な

RMIレジストリ

のポートを指定します。

また、

RMI

レジストリで公開されているサービスを識別できるようにサービス名を設定する必要があります。

与えられた設定で、クライアントは以下のURLで

CabBookingService

に連絡することができます。


rmi://HOST:1199/CabBookingService

最後にサーバーを起動しましょう。そのようなレジストリが利用できない場合は

Spring

が自動的にそれを行うので、私たちは自分でRMIレジストリを開始する必要すらありません。


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

を簡単に使用できるようにする方法を説明しました。そうしないと、レジストリのスピンアップやチェック例外を多用するインターフェイスを使用したサービスの定義など、一連の面倒な作業が必要になります。

いつものように、あなたはソースを見つけるでしょう

https://github.com/eugenp/tutorials/tree/master/spring-remoting/remoting-rmi

[over
GitHubで。