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 命名空间中设置它。