Где я должен получить ChannelHandlerContext для последующего использования при открытых соединениях в Netty?

#netty

#netty

Вопрос:

В документации ChannelHandlerContext объясняется, что a ChannelHandlerContext может быть извлечен для последующего использования. Я внедряю протокол членства на основе сплетен, используя Netty. Каждая работающая система может принимать и создавать соединения. Существует Peer класс с экземпляром для каждого подключенного узла. Этот одноранговый класс имеет атрибут для контекста, позволяющий отправлять сообщения через его экземпляры. Сохранение ChannelHandlerContext при работе с подключением к серверу в моем случае было простым, но я не уверен, где и когда это извлечение должно происходить при открытии соединения. Есть ли рекомендуемый способ извлечения и сохранения ChannelHandlerContext ?

В моем проекте я использую a ChannelOutboundHandlerAdapter , который только добавляет обработчик контекста и удаляет себя из конвейера:

 class PeerContextRetriever extends ChannelOutboundHandlerAdapter {
    private final Peer peer;

    PeerContextActivator(Peer peer) {
        this.peer = peer;
    }

    @Override
    public void connect(ChannelHandlerContext ctx, SocketAddress remoteAddress, SocketAddress localAddress, ChannelPromise promise) throws Exception {
        promise.addListener(future -> peer.setContext(ctx));
        promise.addListener(future -> ctx.channel().pipeline().remove(this));
        super.connect(ctx, remoteAddress, localAddress, promise);
    }
}
 

Это хороший способ сделать это или есть лучший подход?

Ответ №1:

handlerAdded(...) это хорошее место. Вы можете переопределить это в своем ChannelHandler . В конце концов, это на самом деле не имеет большого значения, но handlerAdded является первым, что называется

Комментарии:

1. Спасибо за ваш ответ, @Norman. Я применил ваше предложение, потому что, основываясь только на названии, оно намекает на эту цель. Кроме того, я намеревался добавить это очень рано.