1. 概要

Java リモートメソッド呼び出しを使用すると、別のJava仮想マシンにあるオブジェクトを呼び出すことができます。 これは確立されたテクノロジーですが、このテーマに特化した公式のOracleトレイルでわかるように、使用するのは少し面倒です。

この簡単な記事では、 SpringRemotingRMIをより簡単かつクリーンな方法で活用する方法について説明します。

この記事では、 SpringRemotingの概要についても説明します。 以前の記事でサポートされている他のテクノロジーの詳細を確認できます: HTTP Invokers JMS AMQP Hessian、およびBurlap

2. Mavenの依存関係

以前の記事で行ったように、いくつかの Spring Boot アプリケーションをセットアップします。リモート呼び出し可能オブジェクトを公開するサーバーと、公開されたサービスを呼び出すクライアントです。

必要なものはすべてspring-context jarにあります。これにより、 Spring Boot ヘルパーを使用して、必要なものを取り込むことができます。これは、メインの目標がメインライブラリを利用できるようにすることだけだからです。

次に、通常の spring -boot-starter-webに進みましょう。Tomcat依存関係を削除して、組み込みWebサービスを除外することを忘れないでください。

<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 の使用を容易にする方法を説明しました。そうしないと、レジストリを起動して定義するなど、一連の面倒なタスクが必要になります。チェックされた例外を多用するインターフェイスを使用するサービス。

いつものように、ソースはGitHubにあります。