ShanTianQi

年终述职

工作概述


Activity

contributed projects

一、FMS

change

密钥交换

AES

内部模拟站控

监控心跳

交换密钥

二、api-server

onlineTrucks.stream().parallel().forEach(onlineTruck -> {
          StopPoint stopPoint = finalStopPointsMap.get(onlineTruck.getTRUCK_NO());
          guideTruckJob(onlineTruck, stopPoint);
});

基本原理:

缺点:

异步任务调度 + 并发控制 + 批处理机制

1.生产者-消费者模型(Producer-Consumer Pattern)

2.线程池线程管理(Thread Pool)

3.任务并发限流(Concurrency Throttling)

4.异步任务编排(Async Orchestration)

  1. 调度循环 + 周期控制(Looping Scheduler)
import java.util.concurrent.*;

private static final int THREAD_POOL_SIZE = Runtime.getRuntime().availableProcessors() * 2;
private static final ExecutorService truckJobExecutor = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
private static final int MAX_CONCURRENT_JOBS = THREAD_POOL_SIZE; // 限制同时运行的任务数
private static final Semaphore semaphore = new Semaphore(MAX_CONCURRENT_JOBS);

public void guideJob() {
    while (true) {
        try {
            long beginTimeMs = System.currentTimeMillis();

            List<VehicleWiStatus> onlineTrucks = messageService.getOnlineTrucks();
            Map<String, StopPoint> finalStopPointsMap = messageService.fetchStopPoints();

            long beginTimeMs3 = System.currentTimeMillis();

            List<CompletableFuture<Void>> futures = new ArrayList<>();
            for (VehicleWiStatus onlineTruck : onlineTrucks) {
                StopPoint stopPoint = finalStopPointsMap.get(onlineTruck.getTRUCK_NO());

                futures.add(CompletableFuture.runAsync(() -> {
                    try {
                        semaphore.acquire(); // 控制并发任务数
                        guideTruckJob(onlineTruck, stopPoint);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    } finally {
                        semaphore.release();
                    }
                }, truckJobExecutor));
            }

            CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();

            long beginTimeMs4 = System.currentTimeMillis();
            log.info("单帧多车执行总时长: {} ms.", beginTimeMs4 - beginTimeMs3);

            long endTimeMs = System.currentTimeMillis();
            long gapTimeMs = endTimeMs - beginTimeMs;
            if (gapTimeMs < 1000) {
                Thread.sleep(1000 - gapTimeMs);
            }
            if (gapTimeMs > 500) {
                log.warn("单帧执行时长 {}", gapTimeMs);
            }
        } catch (Exception e) {
            log.error("guideJob Exception: ", e);
        }
    }
}

#年终述职#2025