我使用它是@MessagingGateway
为了在spring-mvc
@Controller
和之间架起桥梁spring-integration
。该@MessagingGateway
声明如下所示:
package a.b.c;
import org.springframework.integration.annotation.*;
import org.springframework.stereotype.Component;
@MessagingGateway(name="inboundGateway" defaultRequestTimeout="2000"
defaultReplyTimeout="2000")
@Component
public interace InboundGateway {
@Gateway(requestChannel = "getSomething")
Message<SomeValue> getSomething(@Headers Map<String, Object> headers);
}
这是从控制器引用的
@Controller
@RequestMapping("/some/base/path")
public class SomeController {
private final InboundGateway inboundGateway;
public SomeController(InboundGateway inboundGateway) {
this.inboundGateway = inboundGateway;
}
@GetMapping(value = "things", produces = { "application/json" })
public ResponseEntity<SomeValue> getSomething(RequestContext<String> requestContext) {
Message<SomeValue> response = inboundGateway.getSomething(requestContext);
....
}
我认为如果在指定时间内没有返回响应,defaultRequestTimeout
和 的定义defaultReplyTimeout
会引发超时。inboundGateway
然而,我发现该方法中使用的时间getSomething()
可能超过指定的时间,在本例中为 2 秒。看来2秒是作为调用下游系统的超时时间,而不是作为返回的超时时间getSomething()
。
我的理解正确吗?是否有一些简单的、声明性的方法来管理该inboundGateway
级别的超时?任何指示表示赞赏。
您所解释的行为对于您的流来说是典型
inboundGateway
的DirectChannel
。这样,消息处理就直接在生成该消息的线程上执行。因此,它无法到达replyTimeout
for 结果,因为该线程被阻塞等待消息处理。请参阅不同渠道的文档中的更多信息:https://docs.spring.io/spring-integration/reference/channel/implementations.html
另请参阅有关网关上的超时的文档:https://docs.spring.io/spring-integration/reference/gateway.html
作为满足您期望的简单解决方案,您可以考虑使用a
QueueChnanel
或. 这样,处理将被移交给不同的线程,并且网关将能够轻松地转到答复等待块。这就是它会产生影响的地方。inboundGateway
ExecutorChannel
replyTimeout
该注释属性 JavaDocs 中也有解释: