Spring 方法 return 无效时集成网关回复通道
Spring Integration Gateway reply channel when method return is void
我 questions/clarifications-to-make 关于 SI 网关功能:
如果我的网关接口定义如下:
public interface MyGateway{
public void myGatewayMethod(Message<?> inMessage);
}
我的网关配置定义如下:
<int:gateway id="mySvcGateway"
service-interface="com.myCompany.myPkg.MyGateway"
error-channel="globalExceptionHandlerChannel">
<int:method name="myGatewayMethod" request-channel="myGatewayReqChannel" />
</int:gateway>
我的 questions/clarifications-to-make 是:
1) 由于网关服务接口方法 return 无效,网关代理 bean 是否仍在 "default-reply-channel" 或用户定义的 "reply-channel" 上寻找响应?
2)也就是说,我还需要提reply-channel="nullChannel"
(或default-reply-channel="nullChannel"
)吗?
或
由于方法return无效,网关会自动理解不收听回复通道?
3) 我是否仍可以向此配置添加 reply-timeout
属性,否则它没有意义,因为没有预期的回复?
在类似的情况下,如果我在服务接口方法中添加另一个方法如下:
public interface MyGateway{
public void myGatewayMethod(Message<?> inMessage);
public Object myGatewayMethod2(Message<?> inMessage);
}
并在我的网关配置中添加此方法,如下所示:
<int:gateway id="mySvcGateway"
service-interface="com.myCompany.myPkg.MyGateway"
error-channel="globalExceptionHandlerChannel">
<int:method name="myGatewayMethod" request-channel="myGatewayReqChannel" />
<int:method name="myGatewayMethod2" request-channel="myGatewayReqChannel2" />
</int:gateway>
4) 在这种情况下,我认为我需要定义 reply-channel
,对吗?
5) default-reply-channel
可能不适用于这种情况,因为对于一种方法网关需要响应而对于其他方法则不需要,对吗?
6) 如果是,那么对于 return 无效的方法,我需要明确提及 reply-channel="nullChannel"
吗?
感谢确认。
拉利特!
感谢提出这么多问题,令我惊讶的是所有问题都围绕着网关的 void
方法。
对所有问题的快速合理回答是:
由于我们在参考手册中没有说明任何关于此事的内容,因此无需担心这样的配置,它应该会按
的预期工作
相信 Spring 整合。
我是在开玩笑,但每个笑话都有一部分是真的。
现在我们来看看GatewayProxyFactoryBean
的源代码:
private Object invokeGatewayMethod(MethodInvocation invocation, boolean runningOnCallerThread) throws Exception {
..........
boolean shouldReply = returnType != void.class;
..................
Object[] args = invocation.getArguments();
if (shouldReply) {
response = shouldReturnMessage ? gateway.sendAndReceiveMessage(args) : gateway.sendAndReceive(args);
}
else {
gateway.send(args);
response = null;
}
}
return (response != null) ? this.convert(response, returnType) : null;
}
其中 MessagingGatewaySupport.send()
代表
this.messagingTemplate.convertAndSend(requestChannel, object, this.historyWritingPostProcessor);
也是void
,最后调用MessageChannel.send()
。
正如您可能猜到的那样,此方法根本不关心 replyChannel
和 replyTimeout
。
从逻辑上讲,它假设 void
方法将忽略这些选项,而其他方法的任何 default-*
不会影响 void
return 类型的选项.
希望我清楚。
我 questions/clarifications-to-make 关于 SI 网关功能:
如果我的网关接口定义如下:
public interface MyGateway{
public void myGatewayMethod(Message<?> inMessage);
}
我的网关配置定义如下:
<int:gateway id="mySvcGateway"
service-interface="com.myCompany.myPkg.MyGateway"
error-channel="globalExceptionHandlerChannel">
<int:method name="myGatewayMethod" request-channel="myGatewayReqChannel" />
</int:gateway>
我的 questions/clarifications-to-make 是:
1) 由于网关服务接口方法 return 无效,网关代理 bean 是否仍在 "default-reply-channel" 或用户定义的 "reply-channel" 上寻找响应?
2)也就是说,我还需要提reply-channel="nullChannel"
(或default-reply-channel="nullChannel"
)吗?
或
由于方法return无效,网关会自动理解不收听回复通道?
3) 我是否仍可以向此配置添加 reply-timeout
属性,否则它没有意义,因为没有预期的回复?
在类似的情况下,如果我在服务接口方法中添加另一个方法如下:
public interface MyGateway{
public void myGatewayMethod(Message<?> inMessage);
public Object myGatewayMethod2(Message<?> inMessage);
}
并在我的网关配置中添加此方法,如下所示:
<int:gateway id="mySvcGateway"
service-interface="com.myCompany.myPkg.MyGateway"
error-channel="globalExceptionHandlerChannel">
<int:method name="myGatewayMethod" request-channel="myGatewayReqChannel" />
<int:method name="myGatewayMethod2" request-channel="myGatewayReqChannel2" />
</int:gateway>
4) 在这种情况下,我认为我需要定义 reply-channel
,对吗?
5) default-reply-channel
可能不适用于这种情况,因为对于一种方法网关需要响应而对于其他方法则不需要,对吗?
6) 如果是,那么对于 return 无效的方法,我需要明确提及 reply-channel="nullChannel"
吗?
感谢确认。
拉利特!
感谢提出这么多问题,令我惊讶的是所有问题都围绕着网关的 void
方法。
对所有问题的快速合理回答是:
由于我们在参考手册中没有说明任何关于此事的内容,因此无需担心这样的配置,它应该会按
的预期工作
相信 Spring 整合。
我是在开玩笑,但每个笑话都有一部分是真的。
现在我们来看看GatewayProxyFactoryBean
的源代码:
private Object invokeGatewayMethod(MethodInvocation invocation, boolean runningOnCallerThread) throws Exception {
..........
boolean shouldReply = returnType != void.class;
..................
Object[] args = invocation.getArguments();
if (shouldReply) {
response = shouldReturnMessage ? gateway.sendAndReceiveMessage(args) : gateway.sendAndReceive(args);
}
else {
gateway.send(args);
response = null;
}
}
return (response != null) ? this.convert(response, returnType) : null;
}
其中 MessagingGatewaySupport.send()
代表
this.messagingTemplate.convertAndSend(requestChannel, object, this.historyWritingPostProcessor);
也是void
,最后调用MessageChannel.send()
。
正如您可能猜到的那样,此方法根本不关心 replyChannel
和 replyTimeout
。
从逻辑上讲,它假设 void
方法将忽略这些选项,而其他方法的任何 default-*
不会影响 void
return 类型的选项.
希望我清楚。