2017-03-16 1 views
1

J'ai écrit un service pour mon client pour faire face à plusieurs clients, il fonctionnait bien, mais la dernière charge de clients a été augmentée et maintenant le code serveur génère une exception et je n'arrive pas à comprendre ce qui se passe.Netty: AVERTISSEMENT: Un événement exceptionCaught() a été déclenché, et il a atteint à la fin du pipeline

Mon code est:

public void run() throws Exception { 

    //System.setProperty("org.jboss.netty.epollBugWorkaround", "true"); 
    EventLoopGroup bossPool = new NioEventLoopGroup(BOSS_THREADS); 
    EventLoopGroup workerPool = new NioEventLoopGroup(MAX_WORKER_THREADS); 

    try { 

     ServerBootstrap boot = new ServerBootstrap(); 
     boot.group(bossPool, workerPool); 
     boot.channel(NioServerSocketChannel.class); 
     boot.childHandler(new Pipeline()); 
     boot.option(ChannelOption.TCP_NODELAY, true); 
     boot.option(ChannelOption.SO_KEEPALIVE, true); 
     boot.option(ChannelOption.SO_REUSEADDR, true); 
     boot.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 6000); 
     boot.option(ChannelOption.SO_TIMEOUT, 6); 
     boot.option(ChannelOption.SO_BACKLOG, 2048); 

     //System.out.println("Server started listening at port : " + port); 
     boot.bind(port).sync().channel().closeFuture().sync(); 

    } catch (InterruptedException e) { 
    } finally { 
     workerPool.shutdownGracefully(); 
     bossPool.shutdownGracefully(); 
    } 
} 

Code Pipeline est:

public class Pipeline extends ChannelInitializer<Channel> { 
    @Override 
    protected void initChannel(Channel ch) throws Exception { 
     // ch.pipeline().addLast("joiner", new JoinRequest()); 
     ch.pipeline().addLast("decoder", new ByteArrayDecoder()); 
     ch.pipeline().addLast("encoder", new StringEncoder()); 
     ch.pipeline().addLast("myHelper", new RequestHandler()); 
     } 
    } 

et voici journal détaillé des erreurs que je reçois sur une base quotidienne:

1006465:54:21:10-16-03-2017Mar 16, 2017 10:21:54 AM   io.netty.channel.DefaultChannelPipeline$TailContext exceptionCaught 
WARNING: An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception. 
java.io.IOException: Too many open files 
    at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) 
    at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422) 
    at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250) 
    at io.netty.channel.socket.nio.NioServerSocketChannel.doReadMessages(NioServerSocketChannel.java:135) 
    at io.netty.channel.nio.AbstractNioMessageChannel$NioMessageUnsafe.read(AbstractNioMessageChannel.java:69) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:514) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:471) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:385) 
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:351) 
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116) 
    at io.netty.util.internal.chmv8.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1412) 
    at io.netty.util.internal.chmv8.ForkJoinTask.doExec(ForkJoinTask.java:280) 
    at io.netty.util.internal.chmv8.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:877) 
    at io.netty.util.internal.chmv8.ForkJoinPool.scan(ForkJoinPool.java:1706) 
    at io.netty.util.internal.chmv8.ForkJoinPool.runWorker(ForkJoinPool.java:1661) 
    at io.netty.util.internal.chmv8.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:126) 

com.idea.builders.RequestHandler oprationSelector 
SEVERE: null 
java.io.FileNotFoundException: config.dat (Too many open files) 
    at java.io.FileInputStream.open0(Native Method) 
    at java.io.FileInputStream.open(FileInputStream.java:195) 
    at java.io.FileInputStream.<init>(FileInputStream.java:138) 
    at java.io.FileInputStream.<init>(FileInputStream.java:93) 
    at java.io.FileReader.<init>(FileReader.java:58) 
    at com.idea.builders.RequestHandler.oprationSelector(RequestHandler.java:175) 
    at com.idea.builders.RequestHandler.messageReceived(RequestHandler.java:97) 
    at com.idea.builders.RequestHandler.messageReceived(RequestHandler.java:35) 
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) 
    at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:84) 
    at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:153) 
    at io.netty.channel.PausableChannelEventExecutor.invokeChannelRead(PausableChannelEventExecutor.java:86) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:389) 
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) 
    at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:84) 
    at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:153) 
    at io.netty.channel.PausableChannelEventExecutor.invokeChannelRead(PausableChannelEventExecutor.java:86) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:389) 
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:956) 
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:127) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:514) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:471) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:385) 
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:351) 
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116) 
    at io.netty.util.internal.chmv8.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1412) 
    at io.netty.util.internal.chmv8.ForkJoinTask.doExec(ForkJoinTask.java:280) 
    at io.netty.util.internal.chmv8.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:877) 
    at io.netty.util.internal.chmv8.ForkJoinPool.scan(ForkJoinPool.java:1706) 
    at io.netty.util.internal.chmv8.ForkJoinPool.runWorker(ForkJoinPool.java:1661) 
    at io.netty.util.internal.chmv8.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:126) 

Mar 16, 2017 10:21:54 AM com.idea.builders.RequestHandler oprationSelector 
SEVERE: null 
java.io.FileNotFoundException: config.dat (Too many open files) 
    at java.io.FileInputStream.open0(Native Method) 
    at java.io.FileInputStream.open(FileInputStream.java:195) 
    at java.io.FileInputStream.<init>(FileInputStream.java:138) 
    at java.io.FileInputStream.<init>(FileInputStream.java:93) 
    at java.io.FileReader.<init>(FileReader.java:58) 
    at com.idea.builders.RequestHandler.oprationSelector(RequestHandler.java:175) 
    at com.idea.builders.RequestHandler.messageReceived(RequestHandler.java:97) 
    at com.idea.builders.RequestHandler.messageReceived(RequestHandler.java:35) 

Que dois-je faire Je dois redémarrer mon serveur tous les jours?

+0

Assurez-vous de fermer tous les fichiers que vous ouvrez, cette erreur est due au fait que vous avez trop de handles de fichiers ouverts sur le système, assurez-vous de tuer les threads enfants une fois les clients déconnectés? – zack6849

+0

Oui, chaque thread est tué et les fichiers sont également fermés. –

+0

De quel système d'exploitation êtes-vous? – Nicholas

Répondre

0

Vous devez remplacer la méthode exceptionCaught dans l'un de vos gestionnaires. Le message signifie que netty caugth exception mais vous ne l'avez pas géré dans aucun de vos gestionnaires. Les exceptions atteignent juste le dernier gestionnaire de pipeline et disparaissent. Vous devriez probablement le gérer dans votre gestionnaire de requêtes.

Et oui fermez tous les flux après avoir fini de travailler avec les fichiers. Et vous devez également libérer des sockets et d'autres ressources sur les exceptions ou les événements non enregistrés.