in server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java [142:231]
public final void configure(HierarchicalConfiguration<ImmutableNode> config) throws ConfigurationException {
enabled = config.getBoolean("[@enabled]", true);
if (!enabled) {
LOGGER.info("{} disabled by configuration", getServiceType());
return;
}
String[] listen = StringUtils.split(config.getString("bind", "0.0.0.0:" + getDefaultPort()), ',');
List<InetSocketAddress> bindAddresses = new ArrayList<>();
for (String aListen : listen) {
String[] bind = StringUtils.split(aListen, ':');
InetSocketAddress address;
String ip = bind[0].trim();
int port = Integer.parseInt(bind[1].trim());
if (!ip.equals("0.0.0.0")) {
try {
ip = InetAddress.getByName(ip).getHostName();
} catch (UnknownHostException unhe) {
throw new ConfigurationException("Malformed bind parameter in configuration of service " + getServiceType(), unhe);
}
}
address = new InetSocketAddress(ip, port);
LOGGER.info("{} bound to: {}:{}", getServiceType(), ip, port);
bindAddresses.add(address);
}
setListenAddresses(bindAddresses.toArray(InetSocketAddress[]::new));
jmxName = config.getString("jmxName", getDefaultJMXName());
int ioWorker = config.getInt("ioWorkerCount", DEFAULT_IO_WORKER_COUNT);
setIoWorkerCount(ioWorker);
Integer bossWorker = config.getInteger("bossWorkerCount", null);
setBossWorkerCount(Optional.ofNullable(bossWorker));
executorGroup = new DefaultEventExecutorGroup(config.getInt("maxExecutorCount", DEFAULT_MAX_EXECUTOR_COUNT),
NamedThreadFactory.withName(jmxName));
configureHelloName(config);
setTimeout(config.getInt(TIMEOUT_NAME, DEFAULT_TIMEOUT));
LOGGER.info("{} handler connection timeout is: {}", getServiceType(), getTimeout());
setBacklog(config.getInt(BACKLOG_NAME, DEFAULT_BACKLOG));
LOGGER.info("{} connection backlog is: {}", getServiceType(), getBacklog());
String connectionLimitString = config.getString("connectionLimit", null);
if (connectionLimitString != null) {
try {
connectionLimit = Integer.parseInt(connectionLimitString);
} catch (NumberFormatException nfe) {
LOGGER.error("Connection limit value is not properly formatted.", nfe);
}
if (connectionLimit < 0) {
LOGGER.error("Connection limit value cannot be less than zero.");
throw new ConfigurationException("Connection limit value cannot be less than zero.");
} else if (connectionLimit > 0) {
LOGGER.info("{} will allow a maximum of {} connections.", getServiceType(), connectionLimitString);
}
}
String connectionLimitPerIP = config.getString("connectionLimitPerIP", null);
if (connectionLimitPerIP != null) {
try {
connPerIP = Integer.parseInt(connectionLimitPerIP);
} catch (NumberFormatException nfe) {
LOGGER.error("Connection limit per IP value is not properly formatted.", nfe);
}
if (connPerIP < 0) {
LOGGER.error("Connection limit per IP value cannot be less than zero.");
throw new ConfigurationException("Connection limit value cannot be less than zero.");
} else if (connPerIP > 0) {
LOGGER.info("{} will allow a maximum of {} per IP connections for {}", getServiceType(), connPerIP, getServiceType());
}
}
sslConfig = SslConfig.parse(config);
Optional.ofNullable(config.getBoolean("gracefulShutdown", null)).ifPresent(this::setGracefulShutdown);
proxyRequired = config.getBoolean(PROXY_REQUIRED, false);
doConfigure(config);
}