RMIによる春のリモーティング

RMIを使用したSpring Remoting

1. 概要

JavaRemote Method Invocationを使用すると、別のJava Virtual Machineにあるオブジェクトを呼び出すことができます。 これは確立されたテクノロジーですが、主題専用のofficial Oracle trailでわかるように、使用するのは少し面倒です。

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

この記事では、Spring Remotingの概要についても説明します。 以前の記事でサポートされている他のテクノロジーの詳細を見つけることができます:HTTP InvokersJMSAMQPHessian, and Burlap

2. Mavenの依存関係

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

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

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


    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()を使用してメソッドを実際に実行しているオブジェクトへの参照を提供する必要があります。 次に、デフォルトのポート1099を使用したくない場合は、サーバーが実行されているマシンで使用可能なRMI registryのポートを提供できます。

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

指定された構成では、クライアントは次のURLでCabBookingServiceに接続できます:rmi://HOST:1199/CabBookingService

最後にサーバーを起動しましょう。 RMIレジストリが利用できない場合は、Springが自動的に開始するため、RMIレジストリを自分で開始する必要はありません。

4. クライアントアプリケーション

それでは、クライアントアプリケーションを作成しましょう。

サーバー側で実行されているサービスによって公開されるのと同じインターフェイスを持つBeanを作成し、受信した呼び出しをサーバーに透過的にルーティングする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の使用を容易にする方法を説明しました。そうしないと、レジストリを起動し、次のようなインターフェイスを使用してサービスを定義するなど、一連の面倒なタスクが必要になります。チェックされた例外の多用。

いつものように、ソースover on GitHub.が見つかります