RMI サポート

この章では、RMI(リモートメソッド呼び出し)に固有のチャネルアダプターを使用して、システムを複数の JVM に分散する方法について説明します。最初のセクションでは、RMI を介したメッセージの送信について説明します。2 番目のセクションでは、RMI を介してメッセージを受信する方法を示します。最後のセクションでは、ネームスペースサポートを使用して RMI チャネルアダプターを定義する方法を示します。

この依存関係をプロジェクトに含める必要があります。

<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-rmi</artifactId>
    <version>5.3.4.RELEASE</version>
</dependency>
compile "org.springframework.integration:spring-integration-rmi:5.3.4.RELEASE"

送信 RMI

RMI を介してチャネルからメッセージを送信するには、RmiOutboundGateway を定義できます。このゲートウェイは、Spring の RmiProxyFactoryBean を内部的に使用して、リモートゲートウェイのプロキシを作成します。Spring Integration を使用しないリモートインターフェースを呼び出すには、Spring の RmiProxyFactoryBean と組み合わせてサービスアクティベーターを使用する必要があることに注意してください。

送信ゲートウェイを構成するには、次のような Bean 定義を記述できます。

<bean id="rmiOutGateway" class=org.spf.integration.rmi.RmiOutboundGateway>
    <constructor-arg value="rmi://host"/>
    <property name="replyChannel" value="replies"/>
</bean>

受信 RMI

RMI を介してメッセージを受信するには、RmiInboundGateway を使用する必要があります。次の例に示すように、ゲートウェイを構成できます。

<bean id="rmiInGateway" class=org.spf.integration.rmi.RmiInboundGateway>
    <property name="requestChannel" value="requests"/>
</bean>
受信ゲートウェイで errorChannel を使用する場合、通常、エラーフローは結果を返すか、例外をスローします。これは、対応する送信ゲートウェイが何らかのレスポンスを待っている可能性が高いためです。エラーフローでメッセージを消費し、レスポンスしないと、受信ゲートウェイに対してレスポンスがありません。例外(errorChannel がない場合のメインフローまたはエラーフロー)は、対応する受信ゲートウェイに伝播します。

RMI 名前空間のサポート

受信ゲートウェイを構成するには、ネームスペースサポートを使用できます。次のコードスニペットは、サポートされているさまざまな構成オプションを示しています。

<int-rmi:inbound-gateway id="gatewayWithDefaults" request-channel="testChannel"/>

<int-rmi:inbound-gateway id="gatewayWithCustomProperties" request-channel="testChannel"
    expect-reply="false" request-timeout="123" reply-timeout="456"/>

<int-rmi:inbound-gateway id="gatewayWithHost" request-channel="testChannel"
    registry-host="localhost"/>

<int-rmi:inbound-gateway id="gatewayWithPort" request-channel="testChannel"
    registry-port="1234" error-channel="rmiErrorChannel"/>

<int-rmi:inbound-gateway id="gatewayWithExecutorRef" request-channel="testChannel"
    remote-invocation-executor="invocationExecutor"/>

ネームスペースサポートを使用して、送信ゲートウェイを構成することもできます。次のコードスニペットは、送信 RMI ゲートウェイのさまざまな構成を示しています。

<int-rmi:outbound-gateway id="gateway"
    request-channel="localChannel"
    remote-channel="testChannel"
    host="localhost"/>

Java 構成を使用した構成

次の例は、Java で受信ゲートウェイと送信ゲートウェイを構成する方法を示しています。

@Bean
public RmiInboundGateway inbound() {
    RmiInboundGateway gateway = new RmiInboundGateway();
    gateway.setRequestChannel(requestChannel());
    gateway.setRegistryHost("host");
    gateway.setRegistryPort(port);
    return gateway;
}

@Bean
@ServiceActivator(inputChannel="inChannel")
public RmiOutboundGateway outbound() {
    RmiOutboundGateway gateway = new RmiOutboundGateway("rmi://host:port/"
        + RmiInboundGateway.SERVICE_NAME_PREFIX + "remoteChannelName");
    return gateway;
}

バージョン 4.3 の時点で、送信ゲートウェイには、RmiProxyFactoryBeanConfigurer インスタンスとサービス url 引数を取る 2 番目のコンストラクターがあります。次の例に示すように、プロキシを作成する前に、たとえば Spring Security ContextPropagatingRemoteInvocationFactory を注入するために、さらに構成することができます。

@Bean
@ServiceActivator(inputChannel="inChannel")
public RmiOutboundGateway outbound() {
    RmiOutboundGateway gateway = new RmiOutboundGateway("rmi://host:port/"
                + RmiInboundGateway.SERVICE_NAME_PREFIX + "remoteChannelName",
        pfb -> {
            pfb.setRemoteInvocationFactory(new ContextPropagatingRemoteInvocationFactory());
        });
    return gateway;
}

バージョン 5.0 以降、configurer 属性を使用して XML 名前空間でこれを設定できます。