есть какой-то контекст выполнения?
у supplyAsync есть второй параметр, туда можно подложить executor. можно заврапить настоящий executor в котором предполагается запускать операции и делегировать запуск тасков из враппера в ностоящий executor при этом логируя, какой таск запускается
От прикольно, а TimeoutException будет выкидываться тут delegate.execute(task);?
Не могу ответит, не знаю. Я даже не уверен что то что я предлагаю правильно. Это просто гепотеза
ты предлагаешь правильно
Тут специфика задачи.
Я с этим не работал, но разве CompletableFuture не умеет эксепшены наружу выбрасывать (exceptionally(), handle()). Передать id таски в мессадже эксепшена не получится?
Вот именно с этим и проблема, нету никакого контекста, либо у меня руки кривые(что тоже вариант) Но пока решения не нашел
Расскажи подробнее про «нет контекста»: ведь если ты хочешь знать, какая задача завалилась - значит, задачи чем-то отличаются? Хотя бы входными параметрами. Их и логировать. Или ты о другом контексте?
Грубый пример После вызова нескольких CompletableFuture for( i .. 10) { val suplier = Suplier { print(I) } CompletableFuture.supplyAsync(supplier, executor).orTimeout(TIMEOUT, TimeUnit.SECONDS) } Как понять какой из них свалился по таймауту?
Примерно так получается на твоем примере: https://gist.github.com/evteev777/8a7ec6ad7efcdd13cc40866dd62206e7 Вывод с рандомными таймаутами: result=0 result=1 ERROR: java.lang.RuntimeException: i=2, cause: java.util.concurrent.TimeoutException ERROR: java.lang.RuntimeException: i=3, cause: java.lang.IllegalArgumentException: Exception message: i=3 result=4 итд Просто из CompletableFuture может вернуться или result, или exception. Но в случае с TimeoutException эксепшен не пробрасывается из задачи, а кидается позже, в самой CompletableFuture. Поэтому остается логировать только входные параметры, а не контекст в процессе выполнения задачи Это в первом приближении, наверняка можно красивее сделать )
“Но в случае с TimeoutException эксепшен не пробрасывается из задачи” да именно это и проблема Ваше решение как раз и дает контекст потому что finalI виден и всех методов вызывающихся с CompletableFuture Моя проблема была в вызове цепочки настройки CompletableFuture без доступа к глобальной переменной, решил тасканием объекта контекста рядом с future, не идеально но работает
Почему неидеально? А как по другому, если не таскать везде объект контекста, который больше ниоткуда недоступен?
Обсуждают сегодня