Apache Mina устанавливает фильтры для разных запросов

Как фильтр Apache Mina обрабатывает разные запросы? Например, у меня есть два запроса: LoginRequest и StudentRequest, и я написал соответствующую фабрику: LoginCodecFactory и StudentCodecFactory. затем я добавил их в фильтр:

acceptor.getFilterChain().addLast("protocol", new ProtocolCodecFilter(new LoginCodecFactory(false)));
    acceptor.getFilterChain().addLast("protocoltest", new ProtocolCodecFilter(new StudentCodecFactory(false)));

Это не работает... Так как же позволить фильтру выбрать соответствующую фабрику для обработки запроса во время выполнения?


person user2716189    schedule 12.09.2013    source источник


Ответы (1)


Я думаю, что вы пытаетесь вложить слишком много логики в свой фильтр. На основе документов целесообразно использовать фильтр для преобразования IoBuffer в какой-либо объект, специфичный для приложения (например, общий объект запроса), но затем работа фильтра выполняется, и этот новый объект должен быть передан в IoHandler.

В этом дизайне один фильтр будет обрабатывать каждый входящий IoBuffer и преобразовывать его таким же образом. Так как есть только один фильтр, проблема выбора фильтра исчезла.

Затем IoHandler получает все входящие запросы, выясняет, какие из них являются LoginRequest, StudentRequest и т. д., и соответствующим образом обрабатывает их. Дизайн объекта запроса и логика определения типа запроса являются частью вашего приложения, а не частью MINA, поэтому вы можете реализовать это любым удобным для вас способом.

person Guido Simone    schedule 12.09.2013
comment
Хорошо, спасибо за ваш ответ. Я видел этот класс в API: DemuxingProtocolDecoder. Кажется, что он может демультиплексировать входящий запрос в другой декодер. Я гуглил, но не нашел примера. Вы знаете, как это использовать? - person user2716189; 12.09.2013
comment
Нет, я никогда не использовал это. Хорошо - я только что прочитал некоторые документы. Выглядит круто. Однако, если бы это был я, я бы придерживался простого дизайна в учебнике MINA - простой фильтр, который перенаправляет данные в IoHandler. - person Guido Simone; 12.09.2013