在特定小时的0纳秒通过Java套接字发送数据

yfjy0ee7  于 5个月前  发布在  Java
关注(0)|答案(1)|浏览(43)

我想在09:00:00.000000000纳秒通过Java中的套接字发送数据。不幸的是,下面的代码有延迟000219600纳秒。我如何改善这一点?

@Scheduled(cron ="xxxxx") // trigger at 08.59.00.0000000000
    @Async
    public void triggerJob() {
        List<OmsOrder> omsOrderList = getOmsSmartOrders();

        if(isStarted || CollectionUtils.isEmpty(omsOrderList)) {
            return;
        }
        isStarted = true;
        List<EnterOrderRequestDto> enterOrderRequestDtoList = omsOrderList.stream().map(this::enterOrderRequestDto).collect(Collectors.toList());

        List<EnterOrderMessage> enterOrderMessageList = enterOrderRequestDtoList.stream().map(OmsOrderMapper::toEnterOrderMessage).collect(Collectors.toList());

        LocalDateTime now = LocalDateTime.now();
        LocalDateTime openingAuction = LocalDateTime.of(now.getYear(), now.getMonth(), now.getDayOfMonth(), 9,0);
        do {
        } while (LocalDateTime.now().isBefore(openingAuction));

  
            log.info("oms smart order triggered {}", LocalDateTime.now() );
            send(omsOrderList.get(0));
        
        isStarted = false;
    }

字符串
log:oms智能订单触发2023-12- 30 T09:00:00.000219600

3vpjnl9f

3vpjnl9f1#

计算机时钟和日程安排有几个问题。最值得注意的是:
1.时钟的精度是有限的。所有时间值都有一个最小值,通常是毫秒或纳秒的倍数。
1.时钟的分辨率有限,即使时钟能够报告精确到纳秒的值,也不意味着它在每一个“活动”纳秒都改变它的报告值。
1.如果线程执行暂停(通过sleep()或其他方式),则此持续时间可以有一个限制。
1.查询时钟也需要时间
1.时钟依赖于底层系统,并且可能在行为上有很大差异。
所以,你肯定不能保证任何精确的调度。但是,你可以使它足够接近实际需要。Java中最精确的东西是System.nanoTime()用于查询时间,Thread.onSpinWait()用于忙碌等待。但是,有一个问题-System.nanoTime()不一定与LocalDateTime.now()对齐,所以它可能很棘手。下面是它可能的样子

// next call suffers from problems 1 and 2 on now variable
  busyWaitUntil(System.nanoTime() + now.until(openingAuction, ChronoUnit.NANOS));
  // ...
  public void busyWaitUntil(long nanos) {
    while (System.nanoTime() < nanos) {
      Thread.onSpinWait();
    }
  }

字符串

相关问题