Hmmm .... this seemed to solve the problem for me:

readerThreadPool = new OrderedThreadPoolExecutor();
filterChain.addLast("readExecutor", new ExecutorFilter(readerThreadPool, IoEventType.MESSAGE_RECEIVED));
filterChain.addLast("codec", new ProtocolCodecFilter(codecFactory));
writerThreadPool = new OrderedThreadPoolExecutor();
filterChain.addLast("writeExecutor", new ExecutorFilter(writerThreadPool, IoEventType.WRITE));


... and then on session close:

readerThreadPool.shutdown();
writerThreadPool.shutdown();


I'm guessing that what going on previously is that when I was using the single thread pool I wasn't explicitly specifying event types that the thread pool should be used for, and so it was also being used to handle events like session closed or (in your case) exception caught. And since the thread pool was already shut down, it wasn't able to handle those events.

That said, I'm a bit unclear about how this thread pool stuff works in Mina 2.0. Is it the code I wrote above considered good practice? i.e.:

* is it sensible to have a thread pool handling MESSAGE_RECEIVED, and WRITE?

* is it sensible to NOT have the thread pool handling other event types? (e.g., session closed and exception)

* Can someone explain why the DEFAULT_EVENT_SET in ExecutorFilter is defined as it is? i.e.:
    private static IoEventType[] DEFAULT_EVENT_SET = new IoEventType[] {
        IoEventType.EXCEPTION_CAUGHT,
        IoEventType.MESSAGE_RECEIVED,
        IoEventType.MESSAGE_SENT,
        IoEventType.SESSION_CLOSED,
        IoEventType.SESSION_IDLE,
        IoEventType.SESSION_OPENED
    };
Why are all these events included?

Perhaps someone more knowledgeable about Mina can offer an explanation.

Thanks,

DR

Patrizio Munzi wrote:
Hi everybody,

I'm having the following exception after the shutdown of the OrderedThreadPoolExecutor.
It looks not an exception I'm responsible for.

I add an OrderedThreadPoolExecutor to my FilterChain as following:

----------------------------
ExecutorFilter executorFilter = new ExecutorFilter();
connector.getFilterChain().addLast("executor", executorFilter);
----------------------------

then I shutdown it in the following way:

----------------------------
CloseFuture closeFuture=session.close(false);
closeFuture.awaitUninterruptibly();
executorFilter.destroy();
----------------------------

with the following exception thrown:

----------------------------
750 [NioProcessor-1] WARN org.apache.mina.core.filterchain.DefaultIoFilterChain - Unexpected exception from exceptionCaught handler.
java.util.concurrent.RejectedExecutionException
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1477) at org.apache.mina.filter.executor.OrderedThreadPoolExecutor.rejectTask(OrderedThreadPoolExecutor.java:309) at org.apache.mina.filter.executor.OrderedThreadPoolExecutor.execute(OrderedThreadPoolExecutor.java:272) at org.apache.mina.filter.executor.ExecutorFilter.fireEvent(ExecutorFilter.java:535) at org.apache.mina.filter.executor.ExecutorFilter.exceptionCaught(ExecutorFilter.java:593) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextExceptionCaught(DefaultIoFilterChain.java:480) at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1100(DefaultIoFilterChain.java:48) at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.exceptionCaught(DefaultIoFilterChain.java:797) at org.apache.mina.core.filterchain.IoFilterAdapter.exceptionCaught(IoFilterAdapter.java:112) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextExceptionCaught(DefaultIoFilterChain.java:480) at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1100(DefaultIoFilterChain.java:48) at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.exceptionCaught(DefaultIoFilterChain.java:797) at org.apache.mina.core.filterchain.IoFilterAdapter.exceptionCaught(IoFilterAdapter.java:112) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextExceptionCaught(DefaultIoFilterChain.java:480) at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireExceptionCaught(DefaultIoFilterChain.java:468) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextSessionClosed(DefaultIoFilterChain.java:397) at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$900(DefaultIoFilterChain.java:48) at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.sessionClosed(DefaultIoFilterChain.java:787) at org.apache.mina.filter.codec.ProtocolCodecFilter.sessionClosed(ProtocolCodecFilter.java:363) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextSessionClosed(DefaultIoFilterChain.java:395) at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$900(DefaultIoFilterChain.java:48) at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.sessionClosed(DefaultIoFilterChain.java:787) at org.apache.mina.core.filterchain.IoFilterAdapter.sessionClosed(IoFilterAdapter.java:96) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextSessionClosed(DefaultIoFilterChain.java:395) at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireSessionClosed(DefaultIoFilterChain.java:388) at org.apache.mina.core.service.IoServiceListenerSupport.fireSessionDestroyed(IoServiceListenerSupport.java:211) at org.apache.mina.core.polling.AbstractPollingIoProcessor.removeNow(AbstractPollingIoProcessor.java:489) at org.apache.mina.core.polling.AbstractPollingIoProcessor.remove(AbstractPollingIoProcessor.java:458) at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:57) at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:872) at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:65) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
   at java.lang.Thread.run(Thread.java:595)
----------------------------

Thanks for reading.

Reply via email to