问题描述
有一个用于分发消息的地图,其定义为:
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链的长度吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)