现在的位置: 首页 > 综合 > 正文

ZeroMQ(java)中对象层次关系的维护

2014年07月03日 ⁄ 综合 ⁄ 共 1619字 ⁄ 字号 评论关闭

在进一步看ZeroMQ(java)的源代码之前,先来搞清楚一个必须要弄懂的地方吧。。。

在前面使用ZeroMQ的时候,就会看到,里面的Socket更多的是一种伪Socket概念,更多的是一种用于维护真正的底层连接的形象,那么就很自然的会想到它持有和维护了底层的连接,可以将其看成是一个集合,其实在整个ZeroMQ的java实现中,这种持有和维护的结构有很多,于是在源码中抽象出了Own类型,用于处理对象之间的这种层次关系。。

先用一张图形来大略的看看Own维护的这种层次关系大概是怎么样子的吧:


其实单纯的来说层次关系还是蛮简单的,每一个own对象都有一个parent指向其的父own对象,当然这个可能是null,同时又有一个集合,用于保存属于自己的所有的own对象,或者说子own对象,也就是如下的两个属性:

    private Own owner;  //这个owner对象的父owner
    private final Set<Own> owned;  //这个owner对象拥有的所有owner

然后来看看Own类型的继承层次:


前面已经初略的介绍过了ZObject类型了,它抽象出了发送命令和执行命令,也就是说通过继承ZObject,可以让对象拥有与其他的ZObject交互的能力,Own类型继承ZOjbect,更多的是要维护销毁,终止等事件父子Own对象之间的协作。。。来看看在Own中定义的如下方法吧:

    //当接收到终止命令之后需要执行的操作
    protected void process_term (int linger_) {
        assert (!terminating);

        for (Own it : owned)  //想拥有的所有own发送终止命令,终止自己的子own对象
            send_term (it, linger_);
        register_term_acks (owned.size ());  //表示当前终止前需要收到这么多的子own对象的终止确认
        owned.clear ();  //清空集合

        terminating = true;  //标志当前的终止状态
        check_term_acks ();    //这里主要的事情是要确认自己的事件是否都已经处理完了,而且子own都已经发过来了终止确认,如果是的话,那么可以终止了,而且还要向父亲发送终止确认
    }

这个方法将会在对象收到term命令后执行的方法,用于终止自己,这里可以看到它先是遍历了所有的子Own对象,向他们发送终止命令,然后这里需要注意的是,register_term_acks,这个方法的意思是用于让当前Own对象记录应该要收到这么多的终止确认,也就是子Own对象收到term命令之后,在终止之后,会向其父Own对象发送终止确认,父Own对象只有收到了所有的子Own对象的终止确认之后,才回销毁自己。。。可以来看看这个check_term_acks方法:

	//这个主要用于向父亲发送关闭确认,这里需要判断自己的命令是否都已经执行完了,而且自己的自own对象都已经发送过来了确认
    private void check_term_acks ()  {
    	//如果已经终止了,而且事件都已经执行完了,而且自己的子own都已经发来了终止确认,那么可以向父亲发送终止的确认,
        if (terminating && processed_seqnum == sent_seqnum.get () &&
              term_acks == 0) {
        	
            assert (owned.isEmpty ());

            if (owner != null)  //如果有父亲的话还需要要父亲发送终止确认
                send_term_ack (owner);  //向父亲发送终止确认
            
            process_destroy ();   //终止
        }
    }

代码应该比较容易懂,可能还需要才考Own对象的一些属性之后才能确认。。不过这个就不细说了。。。

那么到这里,可以初步的了解到,通过Own,ZObject以及mailbox之前的协作来维护各个组件的层次关系和通信。。。

只有搞定这块才能继续代码的阅读。。。

抱歉!评论已关闭.