Dear All,
I am working on an IoT project. I have created a Java application using MINA
library. All the devices are connecting to this Java application using TCP
protocol. I am getting around 3000 packets per hour from about 50 devices as of
now and it will increase soon.
I am facing one issue on production environment. After running say 1-2 days, my
application stops receiving packets from all the devices but application
process keep running. To make it working again, I need to restart my Java
application. I noticed following warnings in logs.
Warnings
[NioSocketAcceptor-3] WARN org.apache.mina.util.DefaultExceptionMonitor
30/11/2018 05:25:40 - Unexpected 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
org.apache.mina.transport.socket.nio.NioSocketAcceptor.accept(NioSocketAcceptor.java:194)
at
org.apache.mina.transport.socket.nio.NioSocketAcceptor.accept(NioSocketAcceptor.java:51)
at
org.apache.mina.core.polling.AbstractPollingIoAcceptor$Acceptor.processHandles(AbstractPollingIoAcceptor.java:544)
at
org.apache.mina.core.polling.AbstractPollingIoAcceptor$Acceptor.run(AbstractPollingIoAcceptor.java:484)
at
org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Due to above warnings in logs, yesterday, after doing some Google, I changed
file limits in "/etc/security/limits.conf" file to 100000 as shown below, but I
did not restart my Java application.
* hard nofile 100000
* soft nofile 100000
Today. I got the same warnings again and I was not getting any packet from any
of the devices. So I restarted my Java application and devices started sending
packets again.
Now, my questions are
- After application stopped receiving packets, I restarted my Java
application today. Will it consider new file limits i.e. 100000 and not give
Exceptions again? Or do I need to reboot machine as well?
- What do you think, why application stops receiving packets from
devices? Is it only due to exception "Too many open files" or it can be due to
any other reasons as well? Please guide.
- Is my MINA configuration fine shown in below Java code? Please
suggest if I need to fine tune it more.
Below is given our code for MINA configuration.
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.log4j.Logger;
import org.apache.mina.core.service.AbstractIoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioDatagramAcceptor;
import com.techm.tnt.protocol.gateway.util.ServerConfigLoader;
/**
* The abstract class for tcp/ip and udp listeners.
*/
public abstract class AbstractListener {
/** The logger instance.*/
private static Logger LOGGER =
Logger.getLogger(AbstractListener.class);
/** The buffer size constant. */
protected static final int BUFFER_SIZE = 2048;
/**
* The method to initialize udp and tcp/ip listeners.
*
* @param portKey
* the port of the udp or tcp/ip listener.
* @throws IOException
* the io exception to be thrown in case of error.
*/
public void init(String portKey) throws IOException {
LOGGER.info("Entering init()");
AbstractIoAcceptor acceptor = initInternal();
acceptor.setHandler(new RequestHandler());
acceptor.getFilterChain().addLast("logger", new
LoggingFilter());
acceptor.getSessionConfig().setReadBufferSize(BUFFER_SIZE);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
if (acceptor instanceof NioDatagramAcceptor) {
((NioDatagramAcceptor)
acceptor).getSessionConfig().setReuseAddress(true);
}
acceptor.bind(new
InetSocketAddress(Integer.parseInt(ServerConfigLoader.getInstance().getProperty(portKey))));
LOGGER.info("Exiting init()");
}
/**
* The abstract method to be over ridden by appropriate listener
(udp /
* tcp/ip) for invoking appropriate listener.
*
* @return the appropriate (udp/ tcp/ip) io acceptor.
*/
public abstract AbstractIoAcceptor initInternal();
}
Appreciate all tour help.
Thanks & Regards,
Krishan Babbar
============================================================================================================================
Disclaimer: This message and the information contained herein is proprietary
and confidential and subject to the Tech Mahindra policy statement, you may
review the policy at http://www.techmahindra.com/Disclaimer.html externally
http://tim.techmahindra.com/tim/disclaimer.html internally within TechMahindra.
===========================================================================================================================
============================================================================================================================
Disclaimer: This message and the information contained herein is proprietary
and confidential and subject to the Tech Mahindra policy statement, you may
review the policy at http://www.techmahindra.com/Disclaimer.html
<http://www.techmahindra.com/Disclaimer.html> externally
http://tim.techmahindra.com/tim/disclaimer.html
<http://tim.techmahindra.com/tim/disclaimer.html> internally within
TechMahindra.
============================================================================================================================