同步情况丢失
创建新的request
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
@Configuration
public class FeignConfig {
@Bean("requestInterceptor")
public RequestInterceptor requestInterceptor(){
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate template) {
//RequestContextHolder拿到刚进来的请求
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();//原先请求
//同步请求头数据,Cookie
String cookie = request.getHeader("Cookie");
template.header("Cookie",cookie);//给新请求同步了原先请求cookie
}
};
}
}
Feign异步情况丢失上下文问题
解决方法:
@Autowired
ThreadPoolExecutor executor;
public OrderConfirmVo confirmOrder() throws ExecutionException, InterruptedException {
//取出共享请求,防止异步丢失
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
CompletableFuture<Void> getAdressFuture = CompletableFuture.runAsync(() -> {
//在异步中设置共享请求,防止异步丢失
RequestContextHolder.setRequestAttributes(requestAttributes);
}, executor);
CompletableFuture.allOf(getAdressFuture).get();
return orderConfirmVo;
}