轉:Mina2.0架構源碼剖析(三)

來源:互聯網
上載者:User

AbstractIoAcceptor類繼承自AbstractIoService基類,並實現了IoAcceptor介面,它主要的成員變數是本地綁定地址。

    private final List<SocketAddress> defaultLocalAddresses =
        new ArrayList<SocketAddress>();
    private final List<SocketAddress> unmodifiableDefaultLocalAddresses =
        Collections.unmodifiableList(defaultLocalAddresses);
    private final Set<SocketAddress> boundAddresses =
        new HashSet<SocketAddress>();

在調用bind或unbind方法時需要先擷取綁定鎖bindLock,具體的綁定操作還是在bind0這個方法中實現的。一旦綁定成功後,就會向服務監聽者發出服務啟用的事件(ServiceActivated),同理,解除綁定也是在unbind0這個方法中具體實現的。一旦解除綁定成功後,就會向服務監聽者發出服務啟用的事件(ServiceDeActivated)。

      AbstractIoConnector類繼承自AbstractIoService基類,並實現了IoConnect介面,連線逾時檢查間隔時間預設是50毫秒,逾時時間預設為1分鐘,使用者可以自行配置。此類中重要的方法就是connect方法,其中調用了具體的串連邏輯實現connect0,

  protected abstract ConnectFuture connect0(SocketAddress remoteAddress,
            SocketAddress localAddress, IoSessionInitializer<? extends ConnectFuture> sessionInitializer);

AbstractIoConnector在AbstractIoService的基礎上,在會話初始化結束時增加了一個功能,就是加入了一個監聽者,當串連請求被取消時立即結束此會話。

    protected final void finishSessionInitialization0(
            final IoSession session, IoFuture future) {
        // In case that ConnectFuture.cancel() is invoked before
        // setSession() is invoked, add a listener that closes the
        // connection immediately on cancellation.
        future.addListener(new IoFutureListener<ConnectFuture>() {
            public void operationComplete(ConnectFuture future) {
                if (future.isCanceled()) {
                    session.close();
                }
            }
        });
}

     下面再來看一個IoProcessor介面的基本實作類別SimpleIoProcessorPool,它的泛型參數是AbstractIoSession的子類,表示此Processor管理的具體會話類型。並且這個類還實現了池化,它會將多個IoSession分布到多個IoProcessor上去管理。下面是文檔中給出的一個樣本:

// Create a shared pool.
 SimpleIoProcessorPool<NioSession> pool = 
         new SimpleIoProcessorPool<NioSession>(NioProcessor.class, 16);
 
 // Create two services that share the same pool.
 SocketAcceptor acceptor = new NioSocketAcceptor(pool);
 SocketConnector connector = new NioSocketConnector(pool);
 
 // Release related resources.
 connector.dispose();
 acceptor.dispose();
 pool.dispose();

     與Processor池有關的包括如下這些成員變數:

  private static final int DEFAULT_SIZE = Runtime.getRuntime().availableProcessors() + 1;//處理池大小,預設是處理器數+1, 便於多核分布處理
    private final IoProcessor<T>[] pool;//IoProcessor池
    private final AtomicInteger processorDistributor = new AtomicInteger();

     Processor池的構造過程,其中有三種建構函式供選擇來構造一個Processor :

  1. 帶參數 ExecutorService 的建構函式.
  2. 帶參數為 Executor的建構函式.
  3. 預設建構函式
        pool = new IoProcessor[size];//構建池
        
        boolean success = false;
        try {
            for (int i = 0; i < pool.length; i ++) {
                IoProcessor<T> processor = null;
                
//有三種建構函式供選擇來構造一個Processor               
 try {
                    try {
                        processor = processorType.getConstructor(ExecutorService.class).newInstance(executor);
                    } catch (NoSuchMethodException e) {
                        // To the next step
                    }
                    
                    if (processor == null) {
                        try {
                            processor = processorType.getConstructor(Executor.class).newInstance(executor);
                        } catch (NoSuchMethodException e) {
                            // To the next step
                        }
                    }
                    
                    if (processor == null) {
                        try {
                            processor = processorType.getConstructor().newInstance();
                        } catch (NoSuchMethodException e) {
                            // To the next step
                        }
                    }
                } catch (RuntimeException e) {
                    throw e;
                } catch (Exception e) {
                    throw new RuntimeIoException(
                            "Failed to create a new instance of " + processorType.getName(), e);
                }
                pool[i] = processor;
            }
            
            success = true;
        } finally {
            if (!success) {
                dispose();
            }
        }

     從Processor池中分配一個processor的過程,注意一個processor是可以同時管理多個session

private IoProcessor<T> getProcessor(T session) 
{//返回session所在的processor,若沒分配,則為之分配一個
        IoProcessor<T> p = (IoProcessor<T>) session.getAttribute(PROCESSOR);//看session的屬性中是否儲存對應的Processor
        if (p == null) 
{//還沒為此session分配processor
            p = nextProcessor();//從池中取一個processor
            IoProcessor<T> oldp =
                (IoProcessor<T>) session.setAttributeIfAbsent(PROCESSOR, p);
            if (oldp != null) 
{//原來的processor
                p = oldp;
            }
        }
        return p;
    }

 

    private IoProcessor<T> nextProcessor() 
    {//從池中分配一個Processor
        checkDisposal();
        return pool[Math.abs(processorDistributor.getAndIncrement()) % pool.length];
    }

 

作者:phinecos(洞庭散人)
出處:http://phinecos.cnblogs.com/
本文著作權歸作者和部落格園共有,歡迎轉載,但請保留此段聲明,並在文章頁面明顯位置給出原文串連。

 

作者:洞庭散人

出處:http://phinecos.cnblogs.com/    

本部落格遵從Creative Commons Attribution 3.0 License,若用於非商業目的,您可以自由轉載,但請保留原作者資訊和文章連結URL。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.