Гарантировано ли, что изменения ChannelPipeline будут иметь немедленный эффект, если они сделаны из потока, не связанног ⇐ JAVA
-
Anonymous
Гарантировано ли, что изменения ChannelPipeline будут иметь немедленный эффект, если они сделаны из потока, не связанног
Я запускаю 2 экземпляра Channel на одном компьютере: первый из них отправляет на второй, и наоборот.
Затем я делаю следующее:
channel2.pipeline().addAfter(OutboundEncoder.NAME, OutgoingAcknowledgementSilencer.NAME, ackSilencer); канал1.writeAndFlush(сообщение); Этот код выполняется в потоке main (то есть, конечно, не в потоке Netty).
В большинстве случаев это работает так, как я ожидаю: когда приходит сообщение, отправленное во второй строке, принимающий конвейер (из channel2) ведет себя так, как если бы у него был этот Добавлен ackSilencer. Но очень редко я наблюдаю, чтобы конвейер channel2 не вызывал обработчик, добавленный в строке 1.
Javadoc ChannelPipeline по адресу https://netty.io/4.0/api/io/netty/chann ... eline.html говорит следующее:
ChannelHandler можно добавить или удалить в любое время, поскольку ChannelPipeline является потокобезопасным. Например, вы можете вставить обработчик шифрования перед обменом конфиденциальной информацией и удалить его после обмена.
Но есть ли гарантия, что такая вставка будет иметь немедленный эффект, если она будет выполнена из другого потока (не потока цикла событий)?
Я запускаю 2 экземпляра Channel на одном компьютере: первый из них отправляет на второй, и наоборот.
Затем я делаю следующее:
channel2.pipeline().addAfter(OutboundEncoder.NAME, OutgoingAcknowledgementSilencer.NAME, ackSilencer); канал1.writeAndFlush(сообщение); Этот код выполняется в потоке main (то есть, конечно, не в потоке Netty).
В большинстве случаев это работает так, как я ожидаю: когда приходит сообщение, отправленное во второй строке, принимающий конвейер (из channel2) ведет себя так, как если бы у него был этот Добавлен ackSilencer. Но очень редко я наблюдаю, чтобы конвейер channel2 не вызывал обработчик, добавленный в строке 1.
Javadoc ChannelPipeline по адресу https://netty.io/4.0/api/io/netty/chann ... eline.html говорит следующее:
ChannelHandler можно добавить или удалить в любое время, поскольку ChannelPipeline является потокобезопасным. Например, вы можете вставить обработчик шифрования перед обменом конфиденциальной информацией и удалить его после обмена.
Но есть ли гарантия, что такая вставка будет иметь немедленный эффект, если она будет выполнена из другого потока (не потока цикла событий)?
Мобильная версия