|
|
@@ -101,12 +101,31 @@ import java.time.LocalDate;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
+import java.util.concurrent.ExecutorService;
|
|
|
+import java.util.concurrent.LinkedBlockingQueue;
|
|
|
+import java.util.concurrent.ThreadPoolExecutor;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
import java.util.function.Consumer;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
+import org.apache.commons.lang3.concurrent.BasicThreadFactory;
|
|
|
+
|
|
|
@Slf4j
|
|
|
@Component("task")
|
|
|
public class Task {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 物流状态查询专用有界线程池,避免打满 ForkJoinPool / Redis / DB 连接池
|
|
|
+ */
|
|
|
+ private static final ExecutorService DELIVERY_STATUS_EXECUTOR = new ThreadPoolExecutor(
|
|
|
+ 4,
|
|
|
+ 8,
|
|
|
+ 60L,
|
|
|
+ TimeUnit.SECONDS,
|
|
|
+ new LinkedBlockingQueue<>(200),
|
|
|
+ new BasicThreadFactory.Builder().namingPattern("delivery-status-%d").daemon(true).build(),
|
|
|
+ new ThreadPoolExecutor.CallerRunsPolicy()
|
|
|
+ );
|
|
|
@Autowired
|
|
|
private FsUserCouponMapper fsUserCouponMapper;
|
|
|
@Autowired
|
|
|
@@ -792,25 +811,27 @@ public class Task {
|
|
|
3.查询订单结果更新order,或者回滚df表*/
|
|
|
//目的是查询创建成功erp的订单,应该在第三部之后改动的数据来作为查询条件;即为待收货订单and拥有deliverySn的数据;
|
|
|
List<FsIntegralOrder> orders = fsIntegralOrderMapper.selectList(Wrappers.<FsIntegralOrder>lambdaQuery().eq(FsIntegralOrder::getStatus, 2).isNotNull(FsIntegralOrder::getDeliverySn));
|
|
|
+ if (orders == null || orders.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
IErpOrderService erpOrderService = getErpService();
|
|
|
- List<CompletableFuture<Void>> futures = new ArrayList<>();
|
|
|
+ List<CompletableFuture<Void>> futures = new ArrayList<>(orders.size());
|
|
|
for (FsIntegralOrder order : orders) {
|
|
|
- // 创建局部final变量副本
|
|
|
final FsIntegralOrder currentOrder = order;
|
|
|
FsStoreOrder order1 = new FsStoreOrder();
|
|
|
order1.setDeliverySn(currentOrder.getDeliverySn());
|
|
|
order1.setOrderCode(currentOrder.getOrderCode());
|
|
|
order1.setOrderId(currentOrder.getOrderId());
|
|
|
- // 异步执行,使用局部变量副本
|
|
|
- CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
|
|
|
+ futures.add(CompletableFuture.runAsync(() -> {
|
|
|
OrderContextHolder.setIntegralOrder(currentOrder);
|
|
|
try {
|
|
|
erpOrderService.getOrderDeliveryStatus(order1);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("积分订单物流状态更新失败 orderId={}, orderCode={}", currentOrder.getOrderId(), currentOrder.getOrderCode(), e);
|
|
|
} finally {
|
|
|
OrderContextHolder.clear();
|
|
|
}
|
|
|
- });
|
|
|
- futures.add(future);
|
|
|
+ }, DELIVERY_STATUS_EXECUTOR));
|
|
|
}
|
|
|
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
|
|
|
}
|
|
|
@@ -858,12 +879,16 @@ public class Task {
|
|
|
if (erpOrderService != null && erpOrderService == dfOrderService) {
|
|
|
orders = fsStoreOrderMapper.selectShippedOrder();
|
|
|
if (orders != null && !orders.isEmpty()) {
|
|
|
- List<CompletableFuture<Void>> futures = new ArrayList<>();
|
|
|
+ List<CompletableFuture<Void>> futures = new ArrayList<>(orders.size());
|
|
|
for (FsStoreOrder order : orders) {
|
|
|
- CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
|
|
|
- erpOrderService.getOrderDeliveryStatus(order);
|
|
|
- });
|
|
|
- futures.add(future);
|
|
|
+ final FsStoreOrder currentOrder = order;
|
|
|
+ futures.add(CompletableFuture.runAsync(() -> {
|
|
|
+ try {
|
|
|
+ erpOrderService.getOrderDeliveryStatus(currentOrder);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("商城订单物流状态更新失败 orderId={}, orderCode={}", currentOrder.getOrderId(), currentOrder.getOrderCode(), e);
|
|
|
+ }
|
|
|
+ }, DELIVERY_STATUS_EXECUTOR));
|
|
|
}
|
|
|
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
|
|
|
}
|
|
|
@@ -1848,35 +1873,41 @@ public class Task {
|
|
|
// 处理待收货订单
|
|
|
if (integralOrders != null && !integralOrders.isEmpty()) {
|
|
|
for (FsIntegralOrder order : integralOrders) {
|
|
|
- CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
|
|
|
- // 使用 OrderContextHolder 和局部副本
|
|
|
- OrderContextHolder.setIntegralOrder(order);
|
|
|
+ final FsIntegralOrder currentOrder = order;
|
|
|
+ futures.add(CompletableFuture.runAsync(() -> {
|
|
|
+ OrderContextHolder.setIntegralOrder(currentOrder);
|
|
|
try {
|
|
|
- // 直接创建 FsStoreOrder 并调用 ERP 服务
|
|
|
FsStoreOrder storeOrder = new FsStoreOrder();
|
|
|
- storeOrder.setDeliverySn(order.getDeliverySn());
|
|
|
- storeOrder.setOrderCode(order.getOrderCode());
|
|
|
- storeOrder.setOrderId(order.getOrderId());
|
|
|
+ storeOrder.setDeliverySn(currentOrder.getDeliverySn());
|
|
|
+ storeOrder.setOrderCode(currentOrder.getOrderCode());
|
|
|
+ storeOrder.setOrderId(currentOrder.getOrderId());
|
|
|
erpOrderService.sendExpressInfoAt9And16(storeOrder);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("积分订单定时发送物流消息失败 orderId={}", currentOrder.getOrderId(), e);
|
|
|
} finally {
|
|
|
OrderContextHolder.clear();
|
|
|
}
|
|
|
- });
|
|
|
- futures.add(future);
|
|
|
+ }, DELIVERY_STATUS_EXECUTOR));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (fsStoreOrders != null && !fsStoreOrders.isEmpty()) {
|
|
|
for (FsStoreOrder order : fsStoreOrders) {
|
|
|
- CompletableFuture<Void> future = CompletableFuture.runAsync(() ->
|
|
|
- erpOrderService.sendExpressInfoAt9And16(order)
|
|
|
- );
|
|
|
- futures.add(future);
|
|
|
+ final FsStoreOrder currentOrder = order;
|
|
|
+ futures.add(CompletableFuture.runAsync(() -> {
|
|
|
+ try {
|
|
|
+ erpOrderService.sendExpressInfoAt9And16(currentOrder);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("商城订单定时发送物流消息失败 orderId={}", currentOrder.getOrderId(), e);
|
|
|
+ }
|
|
|
+ }, DELIVERY_STATUS_EXECUTOR));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 等待所有异步任务完成
|
|
|
- CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
|
|
|
+ if (!futures.isEmpty()) {
|
|
|
+ CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|