有什么方法可以限制CompletableFuture的UniRun链的长度吗?

时间:2020-09-28 03:27:43

标签: java completable-future

有一个用于分发消息的地图,其定义为:

private static ConcurrentHashMap<Integer, CompletableFuture<Void>> dispatch = new ConcurrentHashMap<>();

发送消息的代码是:

dispatch.compute(event.getId() , (eventId, completableFuture) ->
        (completableFuture == null)
                ? CompletableFuture.runAsync(() -> {
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.info(""+event.hashCode()); // just for refers to an event
        }, threadPoolExecutor)
                : completableFuture.thenRunAsync(() -> {
                    try {
                        TimeUnit.SECONDS.sleep(5);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    log.info(""+event.hashCode()); // just for refers to an event
                }, threadPoolExecutor));

其中,每个事件都是一个10M的字符串。

class Event {
    private Integer id;
    private String message;
}

由于UniRun引用事件并且无法限制UniRun的长度,因此代码几乎总是OOM。有什么方法可以限制CompletableFuture的UniRun链的长度吗?

0 个答案:

没有答案