Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Запутался в Spring контроллере  [new]
bob1970
Member

Откуда: Пермь
Сообщений: 204
Не понимаю как так получается в Spring Controller. Пример:
@RestController
public class TestController {
       private SlowObj slowObj;
       @GetMapping("/slow")
	public String time() throws InterruptedException {
		log.info("START {}", this.toString());
		slowObj = new SlowObj();
		String content=slowObj.getContent();
		log.info("EXIT {} {} {}", this.toString(),
				slowObj.toString(),content);
		return content;
	}

	@Override
	public String toString() {
		return "TestController@"+Integer.toHexString(this.hashCode());
	}
}

public class SlowObj {

	private static final Logger log = LoggerFactory.getLogger(SlowObj.class);

	public String getContent() throws InterruptedException {
		log.info("START {}", this.toString());
		TimeUnit.SECONDS.sleep(3);
		log.info("EXIT {}", this.toString());
		return String.format("Content %s", this.toString());
	}

	@Override
	public String toString() {
		return "SlowObj@"+Integer.toHexString(this.hashCode());
	}
}


Запускаю почти одновременно 2 запроса. Ниже логи. Там же и вопрос.

// Первый запрос
2020-03-08 12:30:59.837  TestController : START TestController@23061376
// SlowObj первого запроса
2020-03-08 12:30:59.838  SlowObj        : START SlowObj@64a072b0 

// Сразу же второй запрос
2020-03-08 12:31:00.573  TestController : START TestController@23061376
// SlowObj второго запроса, теперь в TestController slowObj первого запроса как бы потерян
2020-03-08 12:31:00.573  SlowObj        : START SlowObj@6e22a769

2020-03-08 12:31:02.839  SlowObj        : EXIT SlowObj@64a072b0

// КАК ТАК???? Объект SlowObj второго запроса(SlowObj@6e22a769) 
// возвращает содержание ПЕРВОГО запроса(Content SlowObj@64a072b0)
2020-03-08 12:31:02.840  TestController : EXIT TestController@23061376 SlowObj@6e22a769 Content SlowObj@64a072b0

2020-03-08 12:31:03.573  SlowObj        : EXIT SlowObj@6e22a769
2020-03-08 12:31:03.574  TestController : EXIT TestController@23061376 SlowObj@6e22a769 Content SlowObj@6e22a769


И второй вопрос. Почему не закончив работу по первому запросу, принимается второй запрос одним и тем же экземпляром объекта TestController?
8 мар 20, 11:06    [22095367]     Ответить | Цитировать Сообщить модератору
 Re: Запутался в Spring контроллере  [new]
chpasha
Member

Откуда:
Сообщений: 9050
С сервлетами что ли не работал, сразу на спринг давай-давай?

bob1970
Почему не закончив работу по первому запросу, принимается второй запрос одним и тем же экземпляром объекта TestController?
Разве не в этом смысл вебсервера, обслуживать запросы параллельно? с чего ты взял, что на отдельные запросы должны создаваться отдельные экземпляры контроллера? в этом твоя ошибка, из которой и проистекает непонимание сути происходящего. создается ОДИН экземпляр контроллера, который обслуживает ВСЕ запросы параллельно. Значит метод time выполняется конкурентно и его код должен быть потокобезопасен.

bob1970
// КАК ТАК???? Объект SlowObj второго запроса(SlowObj@6e22a769) 
// возвращает содержание ПЕРВОГО запроса(Content SlowObj@64a072b0)

SlowObj у нас где объявлен? в поле класса-синглтона. т.е. твои запросы его конкурентно перезаписывают
8 мар 20, 12:40    [22095389]     Ответить | Цитировать Сообщить модератору
 Re: Запутался в Spring контроллере  [new]
bob1970
Member

Откуда: Пермь
Сообщений: 204
chpasha,
Действительно тупанул. Одиночка в разных тредах.
8 мар 20, 13:07    [22095392]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить