Spring Boot Rest控制器线程在不同的nio线程中重用相同的连接对象,但在单独的类中不重用?

时间:2017-11-02 09:27:33

标签: multithreading rest tomcat spring-boot

我有一个方法,通过使用Spring注释标记为Rest Get Request。

@RequestMapping(value = "/lastname/{lastname}", method = RequestMethod.GET)
public ResponseEntity<?> getRecord(@PathVariable("lastname") String lastname) {

逻辑如下:

  1. 创建连接对象
  2. 通过该对象访问后端系统,只读,非事务性
  3. 在finally子句中,关闭连接
  4. 现在,如果在Firefox中,我使用CTRL-R短按键从同一浏览器选项卡重复调用Rest服务和密钥率 类似于每秒3-7个请求,我得到例外,其中有两个不同的nio线程 尝试关闭相同的连接对象(我通过记录连接object.toString输出确定了这一点)。 这会导致异常被抛出并堆积不可用的非封闭连接。

    2017-11-02 09:52:54.704  INFO 9308 --- [nio-8080-exec-1] s.i.s.inbound.RestApiController     : Closing Connection: Connection@270f2924
    2017-11-02 09:52:54.718  INFO 9308 --- [nio-8080-exec-4] s.i.s.inbound.RestApiController     : Closing Connection: Connection@270f2924
    

    如果来自浏览器的请求率足够慢,例如来自同一浏览器选项卡的每秒1-2个请求,这不会发生,连接对象都是不同的实例。

    如果我将前面描述的逻辑移动到一个单独的类中,并使用单独的非静态方法并替换中的逻辑 为get请求标记的方法,并按如下方式调用它:

    class = new Class();
    class.invoke();
    

    然后它没有例外,工作正常,没有孤儿正确关闭连接。

    但我找不到这个记录,它接缝说nio线程重用线程中的现有对象/实例 是否被调用浏览器中断?或者有人可以解释内部发生的事情吗? 跟踪显示最初例如nio-thread 1关闭连接,然后nio-thread 4以某种方式使用相同的 连接对象实例? 那么建议真的总是将Rest控制器映射方法中的逻辑放在一个单独的类中吗?这记录在哪里?

    感谢。

0 个答案:

没有答案