Должен ли обработчик исходящих событий по умолчанию передавать ChannelPromise? - PullRequest
0 голосов
/ 05 июня 2018

Существует очень мало (хороших) ресурсов по передовым методам обработки ошибок в Netty, и моя команда видела немало случаев, когда ошибки молча проглатывались, что делает отладку менее приятной.

Мне просто было интересно, хорошая ли стратегия по умолчанию - просто передать обещание, переданное в write() при выполнении выигрыша ctx.write(msg,promise)?

Я написал кучу "обучения /исследовательские " тесты, чтобы лучше понять обработку исключений Netty, и я обнаружил, что обработчик исключений ближе к хвосту конвейера обработчика, чем источник исключения, будет вызывать только прослушиватель его обещаний, если каждый обработчик передаст его.До этого момента мы обычно просто делали ctx.write(msg), теряя ChannelPromise, который был отправлен. Конечно, если вы хотите сделать что-то еще и передать другое обещание (ctx.newPromise()), вы делаете это, но яИнтересно, будет ли смысл давать обещание за дефолт?

Если так, почему Netty не делает этого по умолчанию?Я думаю, что это имеет смысл, когда вызывающий просто вызывает перегрузку ctx.write(msg), так как большинство людей не хотят, чтобы исключения отбрасывались без предупреждения.

1 Ответ

0 голосов
/ 10 июня 2018

Да, вам следует передать promise, если вы реализуете ChannelOutboundHandler, фактически это именно та реализация по умолчанию, которая предоставляется ChannelOutboundHandlerAdapter.Если вы не передаете promise, вы несете ответственность за его полное заполнение, что может быть выполнено либо напрямую, либо путем связывания его с другим ChannelPromise, который вы создаете и передаете через write в какой-то момент (или черезChannelFuture, который возвращается ctx.write(Object)

...