Самая сложная проблема отладки, с которой я столкнулся в последнее время, это взаимоблокировки между асинхронными операциями. Например, для двух CompletionStage
цепочек, где первая цепочка вызывает метод, который зависит от завершения второй цепочки, а вторая цепочка вызывает метод, который зависит от завершения первой цепочки. Это не так очевидно в реальной жизни, потому что зависимость имеет тенденцию быть скрытой, и иногда в тупиках участвуют более трех сторон.
Часть проблемы в том, что нет способа узнать, что ожидает CompletableStage
. Это потому, что операция ссылается на CompletableStage
, а не наоборот.
В настоящее время большинство отладчиков обеспечивают определенный уровень обнаружения взаимоблокировок, но это относится только к потокам. Как отлаживать тупики между цепочками CompletableStage?