我想在一个非常精确的时间窗口(例如从20.08.2020 00.00.00到20.08.2020 00.00.50)中发送几个并行的http请求(例如通过async okhttp)。http://www.quartz-scheduler.org has 精度高达1秒。如何安排?
xurqigkl1#
如果您关心服务器接收它们的时间,而不是客户机开始发送的时间,那么您应该使用一些请求来预热okhttp。对于http/1.1连接,您需要多个连接。检查连接池大小,并根据需要进行调整。对于http/2连接,当您转到发送结果时准备就绪。如果您担心任何一个请求的大小,您可能希望通过拥有多个客户机示例来覆盖okhttp的默认行为,以避免共享套接字上的行首阻塞。如上所述,对于java线程调度,使用scheduledexecutorservice,并且可能在事件之前唤醒并旋转到精确的毫秒。你不能使用纳米时间,因为它与一个任意的历元有关,所以毫秒精度可能是你能做的最好的。
7ajki6be2#
您可以在completablefuture中使用java调度任务来调度您的任务:类似这样的方法来调度您的http任务:timeunit可用于调度到毫秒。(timeunit.millishes)
public static <T> CompletableFuture<T> schedule( ScheduledExecutorService executor, Supplier<T> command, long delay, TimeUnit unit ) { CompletableFuture<T> completableFuture = new CompletableFuture<>(); executor.schedule( (() -> { try { return completableFuture.complete(command.get()); } catch (Throwable t) { return completableFuture.completeExceptionally(t); } }), delay, unit ); return completableFuture; }
有关completablefuture的概念,请参阅本文:https://www.artificialworlds.net/blog/2019/04/05/scheduling-a-task-in-java-within-a-completablefuture/或者,您可以编写自己的计划程序:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/scheduledexecutorservice.html编辑:尝试使用以下命令:schedulewithfixeddelay(runnable命令,long initialdelay,long delay,timeunit)
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/Los_Angeles")); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS"); LocalDateTime ldt= LocalDateTime.parse("2020-10-17T12:42:04.000", formatter); ZonedDateTime nextRun= ldt.atZone(ZoneId.of("America/Los_Angeles")); if(now.compareTo(nextRun) > 0) nextRun = nextRun.plusDays(1); Duration duration = Duration.between(now, nextRun); long initalDelay = duration.toMillis(); ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); scheduler.scheduleAtFixedRate(new MyRunnableTask(), initalDelay, TimeUnit.DAYS.toMillis(1), TimeUnit.MILLISECONDS);
2条答案
按热度按时间xurqigkl1#
如果您关心服务器接收它们的时间,而不是客户机开始发送的时间,那么您应该使用一些请求来预热okhttp。
对于http/1.1连接,您需要多个连接。检查连接池大小,并根据需要进行调整。
对于http/2连接,当您转到发送结果时准备就绪。如果您担心任何一个请求的大小,您可能希望通过拥有多个客户机示例来覆盖okhttp的默认行为,以避免共享套接字上的行首阻塞。
如上所述,对于java线程调度,使用scheduledexecutorservice,并且可能在事件之前唤醒并旋转到精确的毫秒。你不能使用纳米时间,因为它与一个任意的历元有关,所以毫秒精度可能是你能做的最好的。
7ajki6be2#
您可以在completablefuture中使用java调度任务来调度您的任务:类似这样的方法来调度您的http任务:
timeunit可用于调度到毫秒。(timeunit.millishes)
有关completablefuture的概念,请参阅本文:
https://www.artificialworlds.net/blog/2019/04/05/scheduling-a-task-in-java-within-a-completablefuture/
或者,您可以编写自己的计划程序:
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/scheduledexecutorservice.html
编辑:
尝试使用以下命令:schedulewithfixeddelay(runnable命令,long initialdelay,long delay,timeunit)