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