Thread timeouts not being set by default.

In SNMP4JSettings.java there is the static initialisation code

private static ThreadFactory threadFactory = new DefaultThreadFactory();

private static long threadJoinTimeout = 60000L;

where DefaultThreadFactory make the call

private long joinTimeout = SNMP4JSettings.getThreadJoinTimeout();

Since threadFactory is created before threadJoinTimeout is set, joinTimeout ends up being 0 which means threads are staying alive indefinitely. The following short Java program demonstrates the problem:

import org.snmp4j.SNMP4JSettings;
import org.snmp4j.util.DefaultThreadFactory;
import java.lang.reflect.Field;

public class Snmp4jJoinTimeoutBug {
public static void main(String args) throws Exception {
long configuredTimeout = SNMP4JSettings.getThreadJoinTimeout();
DefaultThreadFactory factory =
(DefaultThreadFactory) SNMP4JSettings.getThreadFactory();
Field f = DefaultThreadFactory.class.getDeclaredField(“joinTimeout”);
f.setAccessible(true);
long actualTimeout = (long) f.get(factory);

    System.out.println("SNMP4JSettings.threadJoinTimeout = " + configuredTimeout);
    System.out.println("DefaultThreadFactory.joinTimeout  = " + actualTimeout);
}

}

This outputs:

java -cp “.;snmp4j.jar” Snmp4jJoinTimeoutBug
SNMP4JSettings.threadJoinTimeout = 60000
DefaultThreadFactory.joinTimeout = 0

Workaround is to add transport.setSocketTimeout(60000); to the code to manually set the timeout.

Impacts versions 3.9.7 and 3.9.6 at least.

OK, thanks fore reporting it. This has been fixed for 3.10.0.