当我在tomcat或weblogic上使用我的应用程序并拥有以下控制器时:
@ResponseBody
@RequestMapping("/loadByReceiptNo/{receiptNo}/{cashId}")
public Securities loadByReceiptNo(@PathVariable int receiptNo, @PathVariable int cashId) {
return myService.loadByReceiptNo(receiptNo, cashId);
}
调用
/loadByReceiptNo/1
或
/loadByReceiptNo/1/
导致服务器挂起太久而需要重启。 我该如何避免这种情况?
更新
此网址被另一台机器调用,此网址用作网络服务。获得转储威胁,我意识到这部分客户陷入了僵局:
conn.getResponseCode()
这个问题的暂时缓解是:
conn.setConnectTimeout(10000);
conn.setReadTimeout(10000);
任何其他解决方案将不胜感激。
答案 0 :(得分:0)
您提供了错误的网址 - /loadByReceiptNo/1
。您还应该提供{cashId}而不仅仅是{receiptNo}。因此,您的网址应该是/loadByReceiptNo/1/1
。
原因是@Pathvariable 不能为空。您可能想要做类似的事情 -
@ResponseBody
@RequestMapping(value={"/loadByReceiptNo/{receiptNo}/{cashId}","/loadByReceiptNo/{receiptNo}"})
public Securities loadByReceiptNo(@PathVariable Map<String, String> pathVariablesMap) {
if (pathVariables.containsKey("receiptNo") && pathVariables.containsKey("cashId")) {
myService.loadByReceiptNo(receiptNo, cashId);
} else {
//probably return error response
}
}
或仅为/loadByReceiptNo/{receiptNo}
编写一个新的控制器方法。
或者您可以将cashId设为@RequestParam(value="cashId ",required=false)
并使其成为可选项。
您当前的映射方式不正确。但是这些东西不应该让你服务器挂起。所以要么是死锁,要么你的服务/ dao电话花了太长时间。如果是这种情况,我建议使用异步处理,如使用activemq
而不保留服务器线程。只需在验证后返回错误或成功代码,然后从队列中处理请求。