服务器挂在错误的网址cal?

时间:2016-01-10 06:19:04

标签: java spring spring-mvc

当我在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);

任何其他解决方案将不胜感激。

1 个答案:

答案 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而不保留服务器线程。只需在验证后返回错误或成功代码,然后从队列中处理请求。