此问题与this有关。我有一个Restful服务,它以异步方式(使用线程-触发并忘记)调用许多Web服务。我将服务接收到的请求标头传递给这些Web服务。但是,由于这些请求是以异步方式触发的,因此这些请求通常在我的REST服务返回响应之后执行。这将导致HTTP请求对象丢失。因此,如该线程中所建议,我正在使用会话范围来保留请求标头。这会对我产生任何不利影响吗?我必须考虑一种更好的方法吗?
最佳答案
如果您开始使用会话范围存储请求,则您的服务不再是RESTful的,因为它不是无状态的。我建议避免完全使用会话范围。
如果您需要在异步线程中使用请求对象(使用Spring的@Async
批注),只需通过参数将其传递给异步逻辑即可。
像这样:
@Component
public class AsyncUserService {
@Async("customTaskExecutor")
public void updateOrAddUser(int id, HttpServletRequest request) throws {
//do your stuff
}
}
@Controller
@RequestMapping("/users")
public class UserController {
private final AsyncUserService userService;
@Autowired
public UserController(AsyncUserService userService) {
super();
this.userService = userService;
}
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
@ResponseStatus(HttpStatus.OK)
public void putUser(@PathVariable("id") int identifier, HttpServletRequest request) {
userService.updateOrAddUser(identifier, request);
}
}