Java 可侦听的未来回调严重延迟
我对番石榴可上市期货的回调被推迟了。我正在编写一个应用程序,它基本上有一个线程池,一旦“长时间运行任务”完成,就会有一个成功回调,如下所示:Java 可侦听的未来回调严重延迟,java,multithreading,concurrency,guava,completable-future,Java,Multithreading,Concurrency,Guava,Completable Future,我对番石榴可上市期货的回调被推迟了。我正在编写一个应用程序,它基本上有一个线程池,一旦“长时间运行任务”完成,就会有一个成功回调,如下所示: ListenableFuture<Boolean> listenableFuture = service.submit(() -> publish(eventName, record, producer)); Futures.addCallback(listenableFuture, new Fut
ListenableFuture<Boolean> listenableFuture = service.submit(() -> publish(eventName, record, producer));
Futures.addCallback(listenableFuture, new FutureCallback<>() {
@Override
public void onSuccess(Boolean result) {
System.out
.println(LocalTime.now() + " Task completed successfully with result: " + result);
}
@Override
public void onFailure(Throwable t) {
System.out.println(LocalTime.now() + " Task failed with result: " + t.getMessage());
}
}, service);
问题
如果我将threadpool设置为处理1MM的事情,我将看到1MM
网络请求成功
,然后我会看到一个回调println语句被触发。为什么会出现这种情况?for Futures.addCallback声明,回调在执行器中运行。只有在所有其他排队元素完成后,才会运行回调。要解决此问题,您可以创建一个单独的执行器来执行回调,或者因为您似乎控制了池构造函数,所以可以创建一个而不是LinkedBlockingQueue作为任务队列,并对回调进行优先级排序。for Futures.addCallback状态为,回调在执行器中运行。只有在所有其他排队元素完成后,才会运行回调。要解决这个问题,您可以创建一个单独的执行器来执行回调,或者因为您似乎控制了池构造函数,所以您可以创建一个而不是LinkedBlockingQueue作为任务队列,并对回调进行优先级排序。回调不是在同一个执行器上运行的,因此,它们将在实际网络请求任务之后排队?恐怕只是一点猜测。这是什么?1万亿?@AlexeiKaigorodov——100万(1000万)的另一种说法——为什么不100万或1万?类似于“如何修复”的问题应该形成完整的可编译和可执行代码片段。否则,r\n问题可能隐藏在代码的缺失部分,并且我们无法修复它。回调不是在同一个执行器上运行,因此它们将在实际的网络请求任务后面排队吗?恐怕只是一点猜测。这是什么?1万亿?@AlexeiKaigorodov——100万(1000万)的另一种说法——为什么不100万或1万?类似于“如何修复”的问题应该形成完整的可编译和可执行代码片段。否则,问题可能隐藏在代码的缺失部分,并且我们无法修复它。
executorService = new ThreadPoolExecutor(poolSize, poolSize,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(targetAmount),
handler);
service = MoreExecutors.listeningDecorator(executorService);
private Boolean publish(String eventName, ProducerRecord rec, Producer producer) {
AtomicBoolean failed = new AtomicBoolean(false);
producer.send(rec, (metadata, exception) -> {
if (exception != null) {
failed.set(true);
} else {
System.out.println("The network request is successful");
}
});
if (failed.get() == true) {
return false;
}
return true;
}