On Wed, Jul 27, 2011 at 11:43 PM, Emmanuel Lecharny <[email protected]> wrote: > Hi guys, > > today, I had to fought with the NioProcessor executor, while doing a test > with a connector. > > I ran a test where I opened and closed 100 000 connections. The chain was > pretty simple, and I used the default configuration. > > At some point, I got some exceptions : > java.util.concurrent.RejectedExecutionException > at > java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1768) > at > java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:767) > at > java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:658) > at > org.apache.mina.core.polling.AbstractPollingIoProcessor.startupProcessor(AbstractPollingIoProcessor.java:463) > at > org.apache.mina.core.polling.AbstractPollingIoProcessor.remove(AbstractPollingIoProcessor.java:417) > at > org.apache.mina.core.polling.AbstractPollingIoProcessor.remove(AbstractPollingIoProcessor.java:1) > at > org.apache.mina.core.service.SimpleIoProcessorPool.remove(SimpleIoProcessorPool.java:253) > at > org.apache.mina.core.service.SimpleIoProcessorPool.remove(SimpleIoProcessorPool.java:1) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain$HeadFilter.filterClose(DefaultIoFilterChain.java:634) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterClose(DefaultIoFilterChain.java:525) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain.access$8(DefaultIoFilterChain.java:521) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterClose(DefaultIoFilterChain.java:813) > at > org.apache.mina.core.filterchain.IoFilterAdapter.filterClose(IoFilterAdapter.java:143) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterClose(DefaultIoFilterChain.java:525) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain.access$8(DefaultIoFilterChain.java:521) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterClose(DefaultIoFilterChain.java:813) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.filterClose(DefaultIoFilterChain.java:740) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterClose(DefaultIoFilterChain.java:525) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain.fireFilterClose(DefaultIoFilterChain.java:518) > at > org.apache.mina.core.session.AbstractIoSession.close(AbstractIoSession.java:306) > at > org.apache.mina.core.session.AbstractIoSession.close(AbstractIoSession.java:288) > at > org.apache.directory.ldap.client.api.LdapNetworkConnection.unBind(LdapNetworkConnection.java:1777)[21:20:09] > WARN [org.apache.directory.ldap.client.api.LdapNetworkConnection] - > java.util.concurrent.RejectedExecutionException > at > java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1768) > at > java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:767) > at > java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:658) > at > org.apache.mina.core.polling.AbstractPollingIoProcessor.startupProcessor(AbstractPollingIoProcessor.java:463) > at > org.apache.mina.core.polling.AbstractPollingIoProcessor.remove(AbstractPollingIoProcessor.java:417) > at > org.apache.mina.core.polling.AbstractPollingIoProcessor.remove(AbstractPollingIoProcessor.java:1) > at > org.apache.mina.core.service.SimpleIoProcessorPool.remove(SimpleIoProcessorPool.java:253) > at > org.apache.mina.core.service.SimpleIoProcessorPool.remove(SimpleIoProcessorPool.java:1) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain$HeadFilter.filterClose(DefaultIoFilterChain.java:634) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterClose(DefaultIoFilterChain.java:525) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain.access$8(DefaultIoFilterChain.java:521) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterClose(DefaultIoFilterChain.java:813) > at > org.apache.mina.core.filterchain.IoFilterAdapter.filterClose(IoFilterAdapter.java:143) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterClose(DefaultIoFilterChain.java:525) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain.access$8(DefaultIoFilterChain.java:521) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterClose(DefaultIoFilterChain.java:813) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.filterClose(DefaultIoFilterChain.java:740) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterClose(DefaultIoFilterChain.java:525) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain.fireFilterClose(DefaultIoFilterChain.java:518) > at > org.apache.mina.core.session.AbstractIoSession.close(AbstractIoSession.java:306) > at > org.apache.mina.core.session.AbstractIoSession.close(AbstractIoSession.java:288) > at > org.apache.directory.ldap.client.api.LdapNetworkConnection.unBind(LdapNetworkConnection.java:1777) > at org.i2l.samples.LdapTestCase.main(LdapTestCase.java:22) > > I fixed that by adding a RejectExecutionHandler in the ThreadPoolExecutor > created in SimpleIoProcessorPool : > > public SimpleIoProcessorPool(Class<? extends IoProcessor<S>> > processorType, > Executor executor, int size) { > ... > if (createdExecutor) { > this.executor = Executors.newCachedThreadPool(); > > // Set a default reject handler > > ((ThreadPoolExecutor)this.executor).setRejectedExecutionHandler( new > ThreadPoolExecutor.CallerRunsPolicy() ); > } else { > this.executor = executor; > } > > I suggest we add this handler in MINA, when using the default configuration. > > Thoughts ? >
Good idea, if we enqueue too much events the application will slow down.
