У вас есть две опции:
Вариант 1. В ваших классах обслуживания убедитесь, что вы не сохраняете детали запроса в переменных экземпляра.Вместо этого передайте их как аргументы метода.
Например:
Приведенный ниже код повредит значение, сохраненное в userId, если есть одновременные запросы.
@Service
public class SomeService {
String userId;
public void processRequest(String userId, String orderId) {
this.userId = userId;
// Some code
process(orderId);
}
public void process(String orderId) {
// code that uses orderId
}
}
В то время какследующий код является безопасным.
@Service
public class SomeService {
private String userId;
public void processRequest(String userId, String orderId) {
// Some code
process(userId, orderId);
}
public void process(String userId, String orderId) {
// code that uses userId and orderId
}
}
Вариант 2:
Вы можете сохранить конкретные данные запроса в bean-объектах области запроса и вставить их в свои синглтоны.Spring создает прокси для встраиваемых bean-объектов в области запросов и прокси-вызовов для bean-компонента, связанного с текущим запросом.
@RequestScoped
class UserInfo {
}
@Service
class UserService {
@Autowired
private UserInfo userInfo;
public void process(String orderId) {
// It is safe to invoke methods of userInfo here. The calls will be passed to the bean associated with the current request.
}
}