У меня типичная настройка сервера netty, только немного запутанная по поводу «правильного» способа реализации или, скорее, добавления OrderedMemoryAwareThreadPoolExecutor в конвейерную фабрику для конкретных типов запросов. Для большинства запросов подходит типичный запрос / ответ NIO. Однако для конкретного типа запроса я бы хотел использовать традиционный многопоточный ввод / вывод (ala OMATPE) из-за того, что это может быть длительный запрос. То, что я сейчас делаю, это разбор URI, чтобы получить запрос определенного типа. Короткие запросы будут обрабатываться нормально, а запросы типа "/ long / running / request" я продолжаю отправлять в восходящем направлении, который проходит через OMATPE, который затем передается соответствующему обработчику. Это путь? Конвейер выглядит примерно так:
public ChannelPipeline getPipeline() {
return Channels.pipeline(
new HttpMessageEncoder(),
new HttpMessageDecoder(),
new shortLivedRequestHandler(),
executionHandler,
new longLivedRequestHandler());
}
В 'shortLivedRequestHandler' те URI, которые соответствуют "короткоживущему" регулярному выражению, будут обработаны и затем отправлены в нисходящий поток. Если эти URI соответствуют совпадению с «долгоживущим» регулярным выражением, тогда мы передаем в восходящий поток «longLivedRequestHandler», который теоретически будет обрабатывать в неблокирующем потоке ввода-вывода и отправлять ответ в нисходящем направлении после завершения.