netty - Is there a possibility that pipeline.fireChannelActive() is executed twice when executing ServerBootstrap.bind()? -


all following code netty4.0.31.final. serverbootstrap's channel nioserversocketchannel.

the main logic of serverbootstrap.bind(int) in abstractbootstrap.dobind(socketaddress):

private channelfuture dobind(final socketaddress localaddress) {         final channelfuture regfuture = initandregister();         ...         if (regfuture.isdone()) {             ...             dobind0(regfuture, channel, localaddress, promise);             ...         } else {             regfuture.addlistener(new channelfuturelistener() {                 @override                 public void operationcomplete(channelfuture future) throws exception {                     ...                     dobind0(regfuture, channel, localaddress, promise);                 }             });         } } 

the code in initandregister() goes abstractunsafe.register0(channelpromise promise):

private void register0(channelpromise promise) {         try {             ...             boolean firstregistration = neverregistered;             doregister();             ...             if (firstregistration && isactive()) {                 pipeline.firechannelactive();             }         } catch (throwable t) {             ...         }  } 

as can see, pipeline.firechannelactive() may executed here.

let's abstractbootstrap.dobind(socketaddress),in dobind0(regfuture, channel, localaddress, promise) code goes abstractunsafe.bind(socketaddress,channelpromise):

public final void bind(final socketaddress localaddress, final channelpromise promise) {         ...         boolean wasactive = isactive();         try {             dobind(localaddress);         } catch (throwable t) {             ...         }          if (!wasactive && isactive()) {             invokelater(new onetimetask() {                 @override                 public void run() {                     pipeline.firechannelactive();                 }             });         }         ...     } 

as can see, pipeline.firechannelactive() may executed here.

so, there possibility pipeline.firechannelactive() executed twice when creating , binding 1 nioserversocketchannel?

not unless isactive can flip flop true false true again in flow pointed out. think can go active once, false -> true -> false

relevant code post:

boolean firstregistration = neverregistered; ... if (firstregistration && isactive()) {     pipeline.firechannelactive();  // isactive must true } ... boolean wasactive = isactive(); ... // if firechannelactive fired, wasactive true,  // preventing firing again if (!wasactive && isactive()) {       invokelater(new onetimetask() {         @override         public void run() {             pipeline.firechannelactive(); 

Comments

Popular posts from this blog

php - How to add and update images or image url in Volusion using Volusion API -

Laravel mail error `Swift_TransportException in StreamBuffer.php line 269: Connection could not be established with host smtp.gmail.com [ #0]` -

C#.NET Oracle.ManagedDataAccess ConfigSchema.xsd -