Okay so I need to figure out how to work it so no lock is held while calling either the upper or lower filter.
CONFIDENTIALITY NOTICE: The contents of this email message and any attachments are intended solely for the addressee(s) and may contain confidential and/or privileged information and may be legally protected from disclosure. On Sat, Feb 17, 2024 at 5:06 PM Emmanuel Lécharny <[email protected]> wrote: > Hi Jonathan, > > Kishore provided a thrzad dump a few weeks ago, which shows that there > is a lock: > > NioProcessor-12 > --------------- > stackTrace: > java.lang.Thread.State: BLOCKED (on object monitor) > at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:138) > - waiting to lock <0x00007fc1611faec8> (a > com.netscout.nsaapp.geo.minaG10Proto.server.G10StateContext) > at > > org.apache.mina.statemachine.StateMachineProxyBuilder$MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:261) > at jdk.proxy4.$Proxy83.event(jdk.proxy4/Unknown Source) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.event(DefaultIoFilterChain.java:1039) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164) > at > > org.apache.mina.core.filterchain.IoFilterAdapter.event(IoFilterAdapter.java:162) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164) > at > > org.apache.mina.core.filterchain.IoFilterAdapter.event(IoFilterAdapter.java:162) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164) > at > > org.apache.mina.core.filterchain.IoFilterAdapter.event(IoFilterAdapter.java:162) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164) > at > > org.apache.mina.core.filterchain.IoFilterAdapter.event(IoFilterAdapter.java:162) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164) > at > > org.apache.mina.core.filterchain.IoFilterAdapter.event(IoFilterAdapter.java:162) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164) > at > > org.apache.mina.filter.ssl.SSLHandlerG0.finish_handshake(SSLHandlerG0.java:589) > - locked <0x00007fc1611fb470> (a org.apache.mina.filter.ssl.SSLHandlerG0) > at > org.apache.mina.filter.ssl.SSLHandlerG0.receive_loop(SSLHandlerG0.java:271) > at > org.apache.mina.filter.ssl.SSLHandlerG0.receive_loop(SSLHandlerG0.java:246) > at > org.apache.mina.filter.ssl.SSLHandlerG0.receive_loop(SSLHandlerG0.java:246) > at org.apache.mina.filter.ssl.SSLHandlerG0.receive(SSLHandlerG0.java:162) > - locked <0x00007fc1611fb470> (a org.apache.mina.filter.ssl.SSLHandlerG0) > at org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:405) > ... > > > and > > > pool-120-thread-37 > ------------------ > stackTrace: > java.lang.Thread.State: BLOCKED (on object monitor) > at org.apache.mina.filter.ssl.SSLHandlerG0.write(SSLHandlerG0.java:312) > - waiting to lock <0x00007fc1611fb470> (a > org.apache.mina.filter.ssl.SSLHandlerG0) > at org.apache.mina.filter.ssl.SslFilter.filterWrite(SslFilter.java:451) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1500(DefaultIoFilterChain.java:49) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:1146) > at > > org.apache.mina.core.filterchain.IoFilterAdapter.filterWrite(IoFilterAdapter.java:138) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1500(DefaultIoFilterChain.java:49) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:1146) > at > > org.apache.mina.filter.codec.ProtocolCodecFilter.filterWrite(ProtocolCodecFilter.java:332) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1500(DefaultIoFilterChain.java:49) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:1146) > at > > org.apache.mina.filter.executor.ExecutorFilter.filterWrite(ExecutorFilter.java:595) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1500(DefaultIoFilterChain.java:49) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:1146) > at > > com.netscout.nsaapp.geo.minaG10Proto.server.G10GPBMessageIoFilter.filterWrite(G10GPBMessageIoFilter.java:63) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1500(DefaultIoFilterChain.java:49) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:1146) > at > > org.apache.mina.core.filterchain.IoFilterAdapter.filterWrite(IoFilterAdapter.java:138) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1500(DefaultIoFilterChain.java:49) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:1146) > at > > org.apache.mina.core.filterchain.IoFilterAdapter.filterWrite(IoFilterAdapter.java:138) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain.fireFilterWrite(DefaultIoFilterChain.java:746) > at > > org.apache.mina.core.session.AbstractIoSession.write(AbstractIoSession.java:575) > at > > org.apache.mina.core.session.AbstractIoSession.write(AbstractIoSession.java:520) > at > > com.netscout.nsaapp.geo.g10Plugin.g10.processor.G10PluginCaptureProcessor.verifyAndSendStartMsgs(G10PluginCaptureProcessor.java:2627) > at > > com.netscout.nsaapp.geo.g10Plugin.g10.processor.G10PluginCaptureProcessor.sessionConnected(G10PluginCaptureProcessor.java:2552) > at > > com.netscout.nsaapp.geo.minaG10Proto.server.G10MinaClient.connect(G10MinaClient.java:220) > at jdk.internal.reflect.GeneratedMethodAccessor99.invoke(Unknown Source) > at > jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke([email protected] > /DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke([email protected]/Method.java:568) > at > > org.apache.mina.statemachine.transition.MethodTransition.invokeMethod(MethodTransition.java:281) > at > > org.apache.mina.statemachine.transition.MethodTransition.doExecute(MethodTransition.java:232) > at > > org.apache.mina.statemachine.transition.AbstractTransition.execute(AbstractTransition.java:100) > at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:183) > at > > org.apache.mina.statemachine.StateMachine.processEvents(StateMachine.java:170) > at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:158) > - locked <0x00007fc1611faec8> (a > com.netscout.nsaapp.geo.minaG10Proto.server.G10StateContext) > at > > org.apache.mina.statemachine.StateMachineProxyBuilder$MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:261) > at jdk.proxy4.$Proxy83.sessionOpened(jdk.proxy4/Unknown Source) > at > > org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.sessionOpened(DefaultIoFilterChain.java:940) > ... > > > Basically, on the sessionOpened event, the StateMachine filter takes a > lock (0x00007fc1611faec8), then the IoHandler tries to write some data, > which ends in the SslFilter.filterWrite method, which takes a lock > (0x00007fc1611fb470) > > Another thread is processing the messageReceived method, go through the > SslFilter.messageReceived method which takes a lock > (0x00007fc1611fb470), the same as in the upper thread, then goes through > the StateMachine.handle method, which takes a lock (0x00007fc1611faec8, > already seen upper). > > The IoHandler should not try to write something on the sessionOpened > message IMO (until the session has been secured), but in any case, the > double lock is clearly the root cause of the problem. > > > > > On 17/02/2024 17:41, Emmanuel Lécharny wrote: > > Hi Jonathan, > > > > regarding the queing, we did that in MINA 2.1: > > > > public void filterWrite(NextFilter nextFilter, IoSession session, > > WriteRequest writeRequest) throws SSLException { > > if (LOGGER.isDebugEnabled()) { > > LOGGER.debug("{}: Writing Message : {}", > > getSessionInfo(session), writeRequest); > > } > > > > boolean needsFlush = true; > > SslHandler sslHandler = getSslSessionHandler(session); > > > > try { > > synchronized (sslHandler) { > > if (!isSslStarted(session)) { > > sslHandler.scheduleFilterWrite(nextFilter, > > writeRequest); > > } > > ... > > > > and > > > > /* no qualifier */void scheduleFilterWrite(NextFilter nextFilter, > > WriteRequest writeRequest) { > > filterWriteEventQueue.add(new IoFilterEvent(nextFilter, > > IoEventType.WRITE, session, writeRequest)); > > } > > > > Sobasically, of the session handshake has not been fully negociated, > > then we enqueue the write request. Pretty much what you suggest to do > > instead of using synchronized blocks around read and write. > > > > Otherwise, comments inline: > > > > On 17/02/2024 14:06, Jonathan Valliere wrote: > >> There is also some additional complexity supporting the scenario > >> where two > >> different threads are triggering “receive” events on the filter. > > > > You mean on the same session? > > > >> > >> We either have to process ALL messages out of the payload, then AFTER > >> send > >> them to the downstream filters or we have to perform a kind of > >> dual-locking > >> mechanism to ensure that multiple receiver threads to not operate in > >> parallel. Either way, we have to guarantee a serial processing of > >> incoming > >> messages. > > > > Actually, this is not a problem unless someone puts an executor filter > > *before the SslFilter in the chain. We process the incoming message in a > > way a given session is associated with one single IoProcessor instance, > > so all the messages for a given session should be processed sequentially > > by this Io processor. If we don't have an excutor filter before the > > Sslfilter, it should be safe. > > > >> > >> The more I think about it the more concerned I am that we’re following a > >> rabbit down a hole. > >> > >> @Kishore Mokkarala <[email protected]> have you tried NOT using > >> the SSL > >> and instead creating a dummy filter which simply added synchronized to > >> the > >> receive and write method? I would be interested to know if that > >> causes the > >> problem also. Put this dummy filter in the same place as the SSL > >> would be. > > > > Another way to deal with the lock would be to check for the > > SessioSnecured event in the IoHandler side: > > - if the event has not be received, then don't send writes, but enqueue > > them > > - if the session has been secured, then you can write at will > > - when teh sessionSecured even is received, unqueue the write messages. > > > > Somehow, that should replace what I think we should do in the SslFilter. > > > > But I don't think the burden should be put on the MINA library user... > > > >> > >> On Feb 17, 2024 at 2:00:30 AM, Emmanuel Lécharny <[email protected]> > >> wrote: > >> > >>> Hi Jonathan, > >>> > >>> there are two aspects to consider: > >>> > >>> - first the establishemnt of the secured session > >>> - second the standard exchange of data when the session has been > >>> secured. > >>> > >>> In the first case, we should *never* have any write done by the > >>> IoHandler, or those writes should be enqueued until the session has > been > >>> secured. Here, the upstream filters should not be aware that the > session > >>> has been secured or not (all in all, filters are supposed to be > >>> independenct) > >>> > >>> In the second case, the SslFilter is responsible for handling the > >>> encoding and decoding of the data, regardless of what the upper filters > >>> are doing > >>> > >>> So there should not be any assumption made on what wcould or should do > >>> the upstream filters (that's because anyone can add a filter, and we > >>> should not force the implementors to take care of unerlying filters > >>> constraints). > >>> > >>> So the best way to deal with writes while the Secured session > >>> establishment is ongoing is to enqueue the writes until the session is > >>> secured. It adds some complexity, but it's safe for the full stack > >>> (reads are a different beast: we have to assume that we can only read > >>> Handshake packets until the HS is completed) > >>> > >>> I guess it fits with what you have in mind. > >>> > >>> > >>> On 17/02/2024 04:12, Jonathan Valliere wrote: > >>> > >>> I was thinking this over last weekend…. > >>> > >>> > >>> If I simply removed the synchronization then there COULD be several > >>> > >>> incoming data corruption problems unless the upstream filters/ > >>> processors > >>> > >>> MUST guarantee FIFO of the data stream. > >>> > >>> > >>> What I would have todo is push OR copy the incoming buffer into a Queue > >>> > >>> then perform processing off the head of that Queue. Essentially, do > the > >>> > >>> same as the mEncodeQueue but for Decodes. The lock would then only > >>> be held > >>> > >>> when processing data off of that Decode queue. Following this > >>> pattern, I > >>> > >>> could probably remove both the READ and WRITE synchronization blocks. > >>> > >>> > >>> My understanding, for MINA, that the assumption is that it SHOULD be > >>> safe > >>> > >>> to hold on to any object passed into a Filter since object lifecycles > >>> > >>> SHOULD be controlled by the VM and not the User’s code. > >>> > >>> > >>> If we’re in agreement, I can make the change. > >>> > >>> > >>> > >>> On Feb 10, 2024 at 2:14:01 PM, Kishore Mokkarala < > [email protected]> > >>> > >>> wrote: > >>> > >>> > >>>> Any time line for removing synchronization block in SSLFilter? > >>> > >>>> > >>> > >>>> On Sat, 10 Feb, 2024, 9:48 pm Emmanuel Lécharny, <[email protected] > > > >>> > >>>> wrote: > >>> > >>>> > >>> > >>>> Netty is not Apache, but Eclipse. > >>> > >>>> > >>> > >>>> > >>> > >>>> We are discussing the error at the moment, trying to move away the > >>> > >>>> > >>> > >>>> SSLFilter synchronized block. > >>> > >>>> > >>> > >>>> > >>> > >>>> On 10/02/2024 08:10, Kishore Mokkarala wrote: > >>> > >>>> > >>> > >>>>> We had to revert mina version to 2.0.25 from 2.2.1 to make it work in > >>> > >>>> > >>> > >>>>> production and trying for other alternatives like apache netty. > >>> > >>>> > >>> > >>>>> > >>> > >>>> > >>> > >>>>> On Fri, 9 Feb, 2024, 1:59 pm Emmanuel Lécharny, <[email protected] > >>> > >>>> > >>> > >>>>> <mailto:[email protected]>> wrote: > >>> > >>>> > >>> > >>>>> > >>> > >>>> > >>> > >>>>> Hi Jonathan, > >>> > >>>> > >>> > >>>>> > >>> > >>>> > >>> > >>>>> in this very case, I think there is a race condition when > >>>>> using the > >>> > >>>> > >>> > >>>>> SSLFilter in conjonction with the StateMachine filter. > >>> > >>>> > >>> > >>>>> > >>> > >>>> > >>> > >>>>> On 09/02/2024 05:33, Jonathan Valliere wrote: > >>> > >>>> > >>> > >>>>> > No, you should not have to create multiple instances. The > >>> > >>>> > >>> > >>>>> necessary > >>> > >>>> > >>> > >>>>> > stateful data is saved to the Connection. > >>> > >>>> > >>> > >>>>> > > >>> > >>>> > >>> > >>>>> > > >>> > >>>> > >>> > >>>>> > On Feb 1, 2024 at 5:22:36 AM, Kishore Mokkarala > >>> > >>>> > >>> > >>>>> <[email protected] <mailto:[email protected]>> > >>> > >>>> > >>> > >>>>> > wrote: > >>> > >>>> > >>> > >>>>> > > >>> > >>>> > >>> > >>>>> >> Any response would be greatly appreciated. > >>> > >>>> > >>> > >>>>> >> ------------------------------------------ > >>> > >>>> > >>> > >>>>> >> M.V.S.Kishore > >>> > >>>> > >>> > >>>>> >> 91-9886412814 > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> On Wed, 31 Jan 2024 at 22:17, Kishore Mokkarala > >>> > >>>> > >>> > >>>>> <[email protected] <mailto:[email protected]>> > >>> > >>>> > >>> > >>>>> >> wrote: > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> Hi Emmanuel, > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> Do we need to create a new instance of SSLFilter per tcp ip > >>> > >>>> > >>> > >>>>> connection or > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> can we reuse it ? > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> For example, do we need to repeat the same code for each > >>>>> tcp ip > >>> > >>>> > >>> > >>>>> connection > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> ? > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> *Approach 1:* > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> for(int i=0;i< 500;i++) > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> { > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> NioSocketConnector connector = new NioSocketConnector(); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> connector.getFilterChain().addLast("LoggingFilter", > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> G10CaptureService.loggingFilter); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> connector.getFilterChain().addLast("codecFilter", > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> G10CaptureService.probeCodecFilter); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> connector.getFilterChain().addLast("executorFilter", > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> G10CaptureService.executorFilter); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> connector.getFilterChain().addLast("gpbMessageFilter", > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> G10CaptureService.gpbMessageFilter); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> connector.getFilterChain().addLast("keepAliveFilter", > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> G10CaptureService.keepAliveFilter); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> SslFilter sslFilter; > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> try { > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> SSLContext sslContext = TLSUtil.getSSLContext(); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> sslFilter = new CustomSslFilter(sslContext); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> connector.getFilterChain().addFirst("sslFilter", > sslFilter); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> } catch (Exception e) { > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> e.printStackTrace(); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> LOG.error("Exception during creating SSL context..." + > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> XError.getStackTrace(e)); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> } > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> //io handler creation > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> StateMachine stateMachine = > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>> StateMachineFactory.getInstance(IoHandlerTransition.class).create( > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> G10MinaClient.CONNECTED, new > >>> > >>>> > >>> > >>>>> G10MinaClient(processor)); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> IoHandler ioHandler = new > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> StateMachineProxyBuilder().setStateContextLookup( > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> new IoSessionStateContextLookup(new > >>> > >>>> > >>> > >>>>> StateContextFactory() { > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> @Override > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> public StateContext create() { > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> final G10StateContext > >>>>> stateContext = > >>> new > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> G10StateContext(); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> stateContext.setStartedTime(new > >>> Date()); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> LOG.info("G10StateContext > >>>>> initialized > >>> > >>>> > >>> > >>>> at:{} > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> ",System.currentTimeMillis()); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> return stateContext; > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> } > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> })).create(IoHandler.class, stateMachine); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> connector.setHandler(ioHandler); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> connector.connect(primaryAddress); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> connectFuture.awaitUninterruptibly(); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> if (connectFuture.isConnected()) { > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> IoSession session = connectFuture.getSession(); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> // Do something with the session if needed > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> } else { > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> System.err.println("Connection failed for iteration: " + > i); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> } > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> } > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> *Approach 2:* > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> Reuse the generic connector implemented above for opening > >>>>> all > >>> > >>>> > >>> > >>>> TCP/IP > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> connections. > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> //just do the below for getting connections for example > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> NioSocketConnector connector = new NioSocketConnector(); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> //filter chain creation > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> //add SSLFilter to filer chain > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> for(int i=0;i< 500;i++) > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> { > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> ConnectFuture connectFuture = > >>>>> connector.connect(serverAddress); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> connectFuture.awaitUninterruptibly(); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> if (connectFuture.isConnected()) { > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> IoSession session = connectFuture.getSession(); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> // Do something with the session if needed > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> } else { > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> System.err.println("Connection failed for iteration: " + > i); > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> } > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> } > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> Which approach is better ? > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> Regards, > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> ------------------------------------------ > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> M.V.S.Kishore > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> 91-9886412814 > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> >> > >>> > >>>> > >>> > >>>>> > > >>> > >>>> > >>> > >>>>> > >>> > >>>> > >>> > >>>>> -- > >>> > >>>> > >>> > >>>>> *Emmanuel Lécharny* P. +33 (0)6 08 33 32 61 > >>> > >>>> > >>> > >>>>> [email protected] <mailto:[email protected]> > >>> > >>>> > >>> > >>>>> > >>> > >>>> > >>> > >>>>> > >>> > >>> --------------------------------------------------------------------- > >>> > >>>> > >>> > >>>>> To unsubscribe, e-mail: [email protected] > >>> > >>>> > >>> > >>>>> <mailto:[email protected]> > >>> > >>>> > >>> > >>>>> For additional commands, e-mail: [email protected] > >>> > >>>> > >>> > >>>>> <mailto:[email protected]> > >>> > >>>> > >>> > >>>>> > >>> > >>>> > >>> > >>>> > >>> > >>>> -- > >>> > >>>> > >>> > >>>> *Emmanuel Lécharny* P. +33 (0)6 08 33 32 61 > >>> > >>>> > >>> > >>>> [email protected] > >>> > >>>> > >>> > >>>> > >>> > >>>> > >>> > >>> > >>> > >>> -- > >>> *Emmanuel Lécharny* P. +33 (0)6 08 33 32 61 > >>> [email protected] > >>> > >> > > > > -- > *Emmanuel Lécharny* P. +33 (0)6 08 33 32 61 > [email protected] > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > >
