You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by "Mike van Goor (JIRA)" <ji...@apache.org> on 2012/12/14 23:16:15 UTC
[jira] [Commented] (DIRMINA-924) Custom executor for mina acceptor
[ https://issues.apache.org/jira/browse/DIRMINA-924?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13532722#comment-13532722 ]
Mike van Goor commented on DIRMINA-924:
---------------------------------------
Hello Deyan,
I do not know exactly what goes wrong, but I see you instantiating a
ThreadPoolExecutor.
You need to dispose of this as far as I know to close the IoProcessor
properly.
I might be wrong, but that´s the first thing that jumps out when I read
your problem.
I would update the deactivate:
> public synchronized void deactivate() {
> if (this.acceptor != null) {
> this.acceptor.unbind();
> this.acceptor.dispose();
> this.acceptor = null;
this.executor.shutdown();
> }
> }
Regards,
mike
> Custom executor for mina acceptor
> ---------------------------------
>
> Key: DIRMINA-924
> URL: https://issues.apache.org/jira/browse/DIRMINA-924
> Project: MINA
> Issue Type: Improvement
> Components: Core
> Affects Versions: 2.0.7
> Environment: Debian squeeze 2.6.32-5-amd64 jdk1.6.0_32
> Reporter: Deyan Pandulev
>
> The problem is when using custom executor with the acceptor. In that case the opened processes are not cleaned properly. So if my custom executor use SimpleIoProcessorPool with 5 processors when activate and deactive they remain open.
> Step 1:
> Activate and lsof -java_pid will produce:
> java 13796 deyan 4r REG 8,9 644783 47039005 /home/deyan/install/apache mina/apache-mina-2.0.7/dist/mina-core-2.0.7.jar
> java 13796 deyan 5r REG 8,9 26176 47039015 /home/deyan/install/apache mina/apache-mina-2.0.7/lib/slf4j-api-1.6.6.jar
> java 13796 deyan 6r FIFO 0,8 0t0 143881 pipe
> java 13796 deyan 7r FIFO 0,8 0t0 143881 pipe
> java 13796 deyan 8u 0000 0,9 0 618 anon_inode
> java 13796 deyan 9u FIFO 0,8 0t0 143882 pipe
> java 13796 deyan 10r FIFO 0,8 0t0 143882 pipe
> java 13796 deyan 11w 0000 0,9 0 618 anon_inode
> java 13796 deyan 12u FIFO 0,8 0t0 143883 pipe
> java 13796 deyan 13u FIFO 0,8 0t0 143883 pipe
> java 13796 deyan 14r 0000 0,9 0 618 anon_inode
> java 13796 deyan 15r FIFO 0,8 0t0 143884 pipe
> java 13796 deyan 16r FIFO 0,8 0t0 143884 pipe
> java 13796 deyan 17r 0000 0,9 0 618 anon_inode
> java 13796 deyan 18r FIFO 0,8 0t0 143885 pipe
> java 13796 deyan 19r FIFO 0,8 0t0 143885 pipe
> java 13796 deyan 20r 0000 0,9 0 618 anon_inode
> Step 2:
> On deactivate and the same command:
> java 13796 deyan 4r REG 8,9 644783 47039005 /home/deyan/install/apache mina/apache-mina-2.0.7/dist/mina-core-2.0.7.jar
> java 13796 deyan 5r REG 8,9 26176 47039015 /home/deyan/install/apache mina/apache-mina-2.0.7/lib/slf4j-api-1.6.6.jar
> java 13796 deyan 6r FIFO 0,8 0t0 143881 pipe
> java 13796 deyan 7r FIFO 0,8 0t0 143881 pipe
> java 13796 deyan 8u 0000 0,9 0 618 anon_inode
> java 13796 deyan 9u FIFO 0,8 0t0 143882 pipe
> java 13796 deyan 10r FIFO 0,8 0t0 143882 pipe
> java 13796 deyan 11w 0000 0,9 0 618 anon_inode
> java 13796 deyan 12u FIFO 0,8 0t0 143883 pipe
> java 13796 deyan 13u FIFO 0,8 0t0 143883 pipe
> java 13796 deyan 14r 0000 0,9 0 618 anon_inode
> java 13796 deyan 15r FIFO 0,8 0t0 143884 pipe
> java 13796 deyan 16r FIFO 0,8 0t0 143884 pipe
> java 13796 deyan 17r 0000 0,9 0 618 anon_inode
> java 13796 deyan 18r FIFO 0,8 0t0 143885 pipe
> java 13796 deyan 19r FIFO 0,8 0t0 143885 pipe
> java 13796 deyan 20r 0000 0,9 0 618 anon_inode
> So there is no cleanup. If i don't use custom executor the server behaves properly.
> Step 2:
> If i activate again:
> java 13796 deyan 4r REG 8,9 644783 47039005 /home/deyan/install/apache mina/apache-mina-2.0.7/dist/mina-core-2.0.7.jar
> java 13796 deyan 5r REG 8,9 26176 47039015 /home/deyan/install/apache mina/apache-mina-2.0.7/lib/slf4j-api-1.6.6.jar
> java 13796 deyan 6r FIFO 0,8 0t0 143881 pipe
> java 13796 deyan 7r FIFO 0,8 0t0 143881 pipe
> java 13796 deyan 8u 0000 0,9 0 618 anon_inode
> java 13796 deyan 9u FIFO 0,8 0t0 143882 pipe
> java 13796 deyan 10r FIFO 0,8 0t0 143882 pipe
> java 13796 deyan 11w 0000 0,9 0 618 anon_inode
> java 13796 deyan 12u FIFO 0,8 0t0 143883 pipe
> java 13796 deyan 13u FIFO 0,8 0t0 143883 pipe
> java 13796 deyan 14r 0000 0,9 0 618 anon_inode
> java 13796 deyan 15r FIFO 0,8 0t0 143884 pipe
> java 13796 deyan 16r FIFO 0,8 0t0 143884 pipe
> java 13796 deyan 17r 0000 0,9 0 618 anon_inode
> java 13796 deyan 18r FIFO 0,8 0t0 143885 pipe
> java 13796 deyan 19r FIFO 0,8 0t0 143885 pipe
> java 13796 deyan 20r 0000 0,9 0 618 anon_inode
> java 13796 deyan 21r FIFO 0,8 0t0 143996 pipe
> java 13796 deyan 22r FIFO 0,8 0t0 143996 pipe
> java 13796 deyan 23r 0000 0,9 0 618 anon_inode
> java 13796 deyan 24r FIFO 0,8 0t0 143997 pipe
> java 13796 deyan 25r unix 0xffff88011e2fa700 0t0 143977 socket
> java 13796 deyan 26r sock 0,6 0t0 143890 can't identify protocol
> java 13796 deyan 27r FIFO 0,8 0t0 143997 pipe
> java 13796 deyan 28u 0000 0,9 0 618 anon_inode
> java 13796 deyan 29u FIFO 0,8 0t0 143998 pipe
> java 13796 deyan 30r FIFO 0,8 0t0 143998 pipe
> java 13796 deyan 31r 0000 0,9 0 618 anon_inode
> java 13796 deyan 32r FIFO 0,8 0t0 143999 pipe
> java 13796 deyan 33r FIFO 0,8 0t0 143999 pipe
> java 13796 deyan 34r 0000 0,9 0 618 anon_inode
> java 13796 deyan 35r FIFO 0,8 0t0 144000 pipe
> java 13796 deyan 36r FIFO 0,8 0t0 144000 pipe
> java 13796 deyan 37r 0000 0,9 0 618 anon_inode
> java 13796 deyan 38r FIFO 0,8 0t0 144001 pipe
> java 13796 deyan 39r FIFO 0,8 0t0 144001 pipe
> java 13796 deyan 40r 0000 0,9 0 618 anon_inode
> You can see that the anon_inode are doubled.
> I want to ask what am I doing wrong and to point me out how to use custom executor because I want to integrate Mina in Application Server.
> The test code:
> public class SimpleMinaServer {
> private NioSocketAcceptor acceptor;
> private final IoHandler ioHandler;
> private final InetSocketAddress inetSocketAddress;
> private final int threads;
> public SimpleMinaServer(IoHandler ioHandler, InetSocketAddress inetSocketAddress, int threads) {
> this.ioHandler = ioHandler;
> this.inetSocketAddress = inetSocketAddress;
> this.threads = threads;
> }
> public synchronized void activate() throws Exception {
> try {
> Executor executor = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
> ((ThreadPoolExecutor) executor).setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
> IoProcessor<NioSession> processor = new SimpleIoProcessorPool<NioSession>(NioProcessor.class, executor, threads);
> acceptor = new NioSocketAcceptor(processor);
> // If you comment the code above and uncomment the code below it
> // behaves properly
> // acceptor = new NioSocketAcceptor(this.threads);
> acceptor.setReuseAddress(true);
> acceptor.setCloseOnDeactivation(true);
> acceptor.getSessionConfig().setIdleTime(IdleStatus.READER_IDLE, 12);
> DefaultIoFilterChainBuilder filterChain = acceptor.getFilterChain();
> LoggingFilter loggingFilter = new LoggingFilter();
> loggingFilter.setMessageReceivedLogLevel(LogLevel.NONE);
> loggingFilter.setMessageSentLogLevel(LogLevel.NONE);
> loggingFilter.setMessageSentLogLevel(LogLevel.NONE);
> loggingFilter.setSessionClosedLogLevel(LogLevel.NONE);
> loggingFilter.setSessionCreatedLogLevel(LogLevel.NONE);
> loggingFilter.setSessionIdleLogLevel(LogLevel.NONE);
> loggingFilter.setSessionOpenedLogLevel(LogLevel.NONE);
> loggingFilter.setExceptionCaughtLogLevel(LogLevel.DEBUG);
> filterChain.addLast("logging", loggingFilter);
> TextLineCodecFactory customTextLineCodecFactory = new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.NUL,
> LineDelimiter.NUL);
> customTextLineCodecFactory.setDecoderMaxLineLength(16000);
> customTextLineCodecFactory.setEncoderMaxLineLength(16000);
> ProtocolCodecFilter protocolCodecFilter = new ProtocolCodecFilter(customTextLineCodecFactory);
> filterChain.addLast("codec", protocolCodecFilter);
> acceptor.setHandler(ioHandler);
> acceptor.bind(inetSocketAddress);
> System.err.println("Apache Mina Server started on port " + inetSocketAddress.getPort());
> } catch (Exception e) {
> System.err.println("Exception while starting resource adapter");
> throw e;
> }
> }
> public synchronized void deactivate() {
> if (this.acceptor != null) {
> this.acceptor.unbind();
> this.acceptor.dispose();
> this.acceptor = null;
> }
> }
> public static void main(String[] args) throws Exception {
> final SimpleIoHandler ioHandler = new SimpleIoHandler();
> SimpleMinaServer s = new SimpleMinaServer(ioHandler, new InetSocketAddress(9090), 5);
> s.activate();
> final Scanner sc = new Scanner(System.in);
> while (true) {
> sc.nextLine();
> if (s.acceptor != null) {
> s.deactivate();
> System.out.println("Deactivating");
> } else {
> s.activate();
> System.out.println("Activating");
> }
> }
> }
> }
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira