Apache MINA --- [過濾器]

IoFilter是MINA的核心組成部分,它提供了重要的規則.它過來全部在IoService和IoHandler之間的I/O事件和請求.若是你有過相關的Web應用開發經驗,你能夠把它簡單的想象成Servlet過濾器的"兄弟".許多開箱即用的過濾器被提供用來促進網絡應用開發速度,經過使用這些過濾器,能夠簡化典型的橫向關注點,例如:java

    1.LoggingFilter 記錄全部的事件和請求web

    2.ProtocolCodecFilter 將輸入的字節流轉化成簡單的消息對象,反之亦然網絡

    3.CompressionFilter 壓縮數據session

    4.SSLFilter 添加SSL-TLS-StartTLS支持app

    5.更多...ide

你能夠繼承IoAdapter類來替代直接實現IoFilter接口.除非覆蓋方法,否則全部收到的事件將被轉直接轉發到下一個過濾器.spa

//除非你想本身實現全部相關方法,否則繼承IoFilterAdapter是更簡單的作法
public class MyFilter extends IoFilterAdapter {
 
    // 須要注意的是,sessionCreated事件必須在I/O Processor線程中執行,不能轉發給其餘線程
    @Override
    public void sessionCreated(NextFilter nextFilter, IoSession session) throws Exception {
        nextFilter.sessionCreated(session);
    }
 
    @Override
    public void sessionOpened(NextFilter nextFilter, IoSession session) throws Exception {
        nextFilter.sessionOpened(session);
    }
 
    // ProtocolCodecFilter使用空緩衝區來做爲一個內部信號,因此,當自定義Filter被放置在ProtocolCodecFilter以前時,須要進行以下判斷
    @Override
    public void filterWrite(NextFilter nextFilter, IoSession session, WriteRequest request) {
        Object message = request.getMessage();
        if (message instanceof ByteBuffer && !((ByteBuffer) message).hasRemaining()) {
            nextFilter.filterWrite(session, request);
            return;
        }
    }
 
    @Override
    public void messageSent(NextFilter nextFilter, IoSession session, WriteRequest request) throws Exception {
        Object message = request.getMessage();
        if (message instanceof ByteBuffer && !((ByteBuffer) message).hasRemaining()) {
            nextFilter.messageSent(session, request);
            return;
        }
    }
}

備註:線程

    官方文檔說明中描述,若是你的過濾器對輸入輸出對象作了類型轉換,那麼你必需要同時實現filterWrite和messageSent,若是你的過濾器沒有作這樣的轉換,也建議這樣實現....綜上所述,自定義過濾器直接實現這兩個方法.(我是這麼理解的...)code

下面給出原文:orm

If you are going to transform an incoming write request via IoSession.write(), things can get pretty tricky. For example, let's assume your filter transforms HighLevelMessage to LowLevelMessage when IoSession.write() is invoked with a HighLevelMessage object. You could insert appropriate transformation code to your filter's filterWrite() method and think that's all. However, you have to note that you also need to take care of messageSent event because an IoHandler or any filters next to yours will expect messageSent() method is called with HighLevelMessage as a parameter, because it's irrational for the caller to get notified that LowLevelMessage is sent when the caller actually wrote HighLevelMessage. Consequently, you have to implement both filterWrite() and messageSent() if your filter performs transformation.

Please also note that you still need to implement similar mechanism even if the types of the input object and the output object are identical (e.g. CompressionFilter) because the caller of IoSession.write() will expect exactly what he wrote in his or her messageSent() handler method.

相關文章
相關標籤/搜索