xxljob里面如果使用了openfeign,则必须引入
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(new MockHttpServletRequest()));
@Autowired
private IMessageSendClient messageSendClient;
@XxlJob("settlementAccountJob")
public void settlementAccountJob() {
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(new MockHttpServletRequest()));
messageSendClient.sendMessage(MessageSendDTO.builder()
.orderId(settlementItemEntity.getId())
.userId(settlementItemEntity.getUserId())
.userType(MsgUserType.ADMIN_USER)
.eventType(MsgContent.NOTICE_SETTLEMENT_NOTE)
.build());
}
feign接口使用CompletableFuture异步调用,请求上下文丢失处理
private static final ThreadPoolExecutor THREADPOOLEXECUTOR =
new ThreadPoolExecutor (
100,
100,
100,
TimeUnit.SECONDS,
new ArrayBlockingQueue<> (1000));
public static void main(String[] args) {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes ();
CompletableFuture<Void> task1 = CompletableFuture.runAsync (() -> {
// 解决Feign异步调用丢失请求头的问题
RequestContextHolder.setRequestAttributes (requestAttributes);
}, THREADPOOLEXECUTOR);
CompletableFuture<Void> task2 = CompletableFuture.runAsync (() -> {
// 解决Feign异步调用丢失请求头的问题
RequestContextHolder.setRequestAttributes (requestAttributes);
}, THREADPOOLEXECUTOR);
// 等待任务都完成
try {
CompletableFuture.allOf (task1, task2).get ();
} catch (InterruptedException | ExecutionException e) {
throw new RuntimeException (e);
}
}