有一个用于分发消息的地图,其定义为:
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链的长度吗?