RMI 支持

此模块自 5.4 起已弃用,没有替换,将在 6.0 中删除。

本章说明如何使用特定于 RMI(远程方法调用)的通道适配器在多个 JVM 上分发系统。第一部分处理通过 RMI 发送消息。第二部分显示如何通过 RMI 接收消息。最后一节展示了如何使用命名空间支持来定义 RMI 通道适配器。

您需要将此依赖项包含到您的项目中:

Maven
<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-rmi</artifactId>
    <version>5.5.13</version>
</dependency>
Gradle
compile "org.springframework.integration:spring-integration-rmi:5.5.13"

出站 RMI

要通过 RMI 从通道发送消息,您可以定义一个RmiOutboundGateway. 该网关在内部使用 SpringRmiProxyFactoryBean为远程网关创建代理。请注意,要调用不使用 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 参数。它允许在创建代理之前进行进一步的配置——例如,注入 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 命名空间中设置它。


1. see XML Configuration