我面临的一个我不完全了解的问题。
我正在发出触发数据库上11k插入的http.post()请求。这花费了一段时间(超过3分钟),我能够通过批量插入来改进它,并在2分钟内将其减少,但这不是重点。关键是我注意到,如果请求花费的时间超过2分钟,则可以看到触发了相同的请求。
在“网络”选项卡上的调试器窗口中,这看不到。在那里,我只看到一个请求。
以下是我针对请求的角度代码示例
this.http.post(this.portfoliosUrl + '/import-portfolios', portfolios);
我注意到这是客户端触发2请求的原因,因为我试图像这样增加超时时间:
this.http.post<Portfolio[]>(this.portfoliosUrl + '/import-portfolios', portfolios)
.pipe(
timeout(300000),
catchError(e => {
// do something on a timeout
console.log("error importing portfolio: " + e)
return of(null);
})
);
显然,超时未达到我的预期。我没有等待5分钟,直到超时。但是因为我返回的是null,所以它将其作为正确的响应接受,并且不会触发第二个请求。
在服务器端,我们可以看到重复的请求:
2019-05-14 13:43:45 [http-nio-8181-exec-3] DEBUG com.robecosam.samsara.security.PathLocationStrategyFilter:35 - PathLocationStrategyFilter: '/rest/portfolios/import-portfolios' Should NOT dispatch
2019-05-14 13:45:45 [http-nio-8181-exec-4] DEBUG com.robecosam.samsara.security.PathLocationStrategyFilter:35 - PathLocationStrategyFilter: '/rest/portfolios/import-portfolios' Should NOT dispatch
如您所见,两个不同的线程,相同的URL和相差2分钟的时间。
这很危险,因为我们正在谈论具有副作用的POST请求。如果两次提出请求,我们可能会遇到麻烦,例如转移额外的钱。
有人可以解释一下为什么Angular在服务器无响应2分钟后重试请求吗?我该如何解决?是否可以增加http超时?可以避免重复通话吗?
非常感谢您的帮助。
致谢