Netty — это высокопроизводительная асинхронная, управляемая событиями платформа NIO.,Он обеспечивает поддержку TCP, UDP и передачи файлов.,И это может упростить процесс разработки веб-приложений. В Нетти,ChannelInboundHandler
Интерфейс для обработки входящих событий,то есть внешнийданныеили действуйте, чтобы войтиNettyСобытие приложения。иSimpleChannelInboundHandler
даChannelInboundHandlerAdapter
подкласс,Это обеспечивает более простой способ обработки входящих данных.
В этой статье мы подробно познакомимсяSimpleChannelInboundHandler
технические подробности,Включая принцип его работы, использование и анализ исходного кода.
SimpleChannelInboundHandler
даудобныйизпроцессор,для обработки входящихданные。этонаследоватьсChannelInboundHandlerAdapter
,И предоставляет методы обработки сообщений типа Безопасность. Это означает, что вы можете определить методы, которые обрабатывают только определенные типы сообщений.,Вместо обработки всех типов сообщений.
Когда поступает новый блок данных,Nettyбудет инкапсулирован вChannelHandlerContext
объект,и передать егоSimpleChannelInboundHandler
изchannelRead0
метод。этотметод Юкодобрыйвыполнить,Используется для обработки определенных типов сообщений.
SimpleChannelInboundHandler
верно ChannelInboundHandlerAdapter
улучшениеSimpleChannelInboundHandler
иChannelInboundHandlerAdapter
существоватьNettyКаждый в кадресиграет важную рольиз Роль,этоихсуществовать Существуют различия при обработке входящих сообщений。по сравнению сChannelInboundHandlerAdapter
,SimpleChannelInboundHandler
Еще поработал следующим образом::
SimpleChannelInboundHandler
существоватькогда сообщение получено,Он автоматически проверит, соответствует ли тип сообщения типу соответствия, указанному параметром Дженерики. если совпадает,Затем продолжите обработку, если совпадений нет;,тогда пройдиctx.fireChannelRead(msg)
передать сообщение следующемуChannelInboundHandler
。SimpleChannelInboundHandler
встречаспереместить его изObject
Преобразование типа в Дженерики Спецификация параметровиздобрыйформа,и перешел кchannelRead0
метод。Это позволяет избежатьсуществоватьChannelInboundHandlerAdapter
Вручнуюдобрыйформа转换изнуждаться。SimpleChannelInboundHandler
существовать处理完информация后,будет основано наautoRelease
свойствоизценитьсдвигаться释放информацияобъектзаниматьизресурс(нравитьсяByteBuf
из Память)。этотдапроходитьвызовReferenceCountUtil.release(msg)
выполнитьиз,Это позволяет избежать громоздкой операции по освобождению ресурсов вручную. В сравнении,ChannelInboundHandlerAdapter
нуждаться开发者существоватьсоответствующийиз时候手двигаться释放ресурс。SimpleChannelInboundHandler
проходитьchannelRead
иchannelRead0
методвыполнить了шаблон метода шаблона。channelRead
метод Ответственныйсоответствие типови Выпуск ресурсаи другая общая логика,иchannelRead0
метод Оставь это своему сынудобрыйвыполнить具体изинформация处理逻辑。этот种模式使得子добрый Умение сосредоточиться на бизнес-логикеизвыполнить,и Не нужно заботиться Выпуск пара и другая общая логика.SimpleChannelInboundHandler
даодин Дженерикидобрый,Позволяет разработчикам указывать типы сообщений для обработки. Это делает код более типичным. Безопасность.,Ошибки преобразования типов и исключения во время выполнения исключены. В сравнении,ChannelInboundHandlerAdapter
Прямое управлениеObject
добрыйформа,Тип Безопасность менее сексуален.SimpleChannelInboundHandler
предоставилсоответствие типов、автоматическое преобразование типовисдвигаться Выпуск ресурсаи другие функции,поэтомуэто Входящие упрощенныеинформацияиз Процесс обработки。Разработчикам нужно тольконаследоватьSimpleChannelInboundHandler
и реализоватьchannelRead0
методможет быстро разработать эффективный、Стабильное веб-приложение.В итоге,SimpleChannelInboundHandler
по сравнению сChannelInboundHandlerAdapter
существоватьсоответствие типов、Выпуск ресурса、шаблон метода шаблона、Поддержка дженерикови Упрощение процесса разработки и т.д.предоставил Болееиз Функцияиудобство。Это делаетSimpleChannelInboundHandler
стать специфичным для обработкидобрыйформа入站информация时из首选процессор。
Чтобы использоватьSimpleChannelInboundHandler
,Вам нужно создать из него класс наблюдения,и реализоватьchannelRead0
метод。существоватьэтотметодсередина,Вы можете определить, как обрабатывать определенные типы сообщений.
Вот простой пример:
public class MySimpleChannelInboundHandler extends SimpleChannelInboundHandler<String> {
@Override
protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
// Обработать полученное строковое сообщение
System.out.println("Received message: " + msg);
}
}
В этом примере,Мы создалиMySimpleChannelInboundHandler
добрый,этотолько обрабатыватьString
добрыйформаизинформация。При получении строкового сообщения,Он будет распечатан.
нижедаSimpleChannelInboundHandler
из Часть исходного кода,Показываем, как он обрабатывает входящие данные:
public abstract class SimpleChannelInboundHandler<I> extends ChannelInboundHandlerAdapter {
// ...
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
boolean release = true;
try {
if (acceptInboundMessage(msg)) {
@SuppressWarnings("unchecked")
I imsg = (I) msg;
channelRead0(ctx, imsg);
} else {
release = false;
ctx.fireChannelRead(msg);
}
} finally {
if (autoRelease && release) {
ReferenceCountUtil.release(msg);
}
}
}
// ...
protected abstract void channelRead0(ChannelHandlerContext ctx, I msg) throws Exception;
}
существоватьchannelRead
методсередина,Сначала проверьте, соответствует ли полученное сообщение тому типу, который ожидает процессор. в случае,Затем преобразуйте сообщение в правильный тип.,и позвониchannelRead0
метод Процесс。нравиться Фрукты или нетда,Такпередать сообщение следующемуChannelInboundHandler
。
также,SimpleChannelInboundHandler
возвращатьсяпредоставилодинautoRelease
свойство,для контроляданетсдвигаться释放информация。нравиться Если установлено значениеtrue
,Затем после обработки сообщения,встречасдвигатьсявызовReferenceCountUtil.release(msg)
освободить ресурсы сообщений。
SimpleChannelInboundHandler
даNettyсерединаодин非常有用изпроцессор,Он предоставляет методы обработки сообщений типа Безопасность.,Входящие упрощенныеданныеиз Обработка。проходитьнаследоватьэтотдобрыйи реализоватьchannelRead0
метод,Вы можете легко обрабатывать определенные типы сообщений,И жестко привязать логику обработки к типу сообщения. Это делает код более понятным, простым в обслуживании и понятным.