use of org.jivesoftware.openfire.net.StalledSessionsFilter in project Openfire by igniterealtime.
the class MINAConnectionAcceptor method start.
/**
* Starts this acceptor by binding the socket acceptor. When the acceptor is already started, a warning will be
* logged and the method invocation is otherwise ignored.
*/
@Override
public synchronized void start() {
if (socketAcceptor != null) {
Log.warn("Unable to start acceptor (it is already started!)");
return;
}
try {
// Configure the thread pool that is to be used.
final int initialSize = (configuration.getMaxThreadPoolSize() / 4) + 1;
final ExecutorFilter executorFilter = new ExecutorFilter(initialSize, configuration.getMaxThreadPoolSize(), 60, TimeUnit.SECONDS);
final ThreadPoolExecutor eventExecutor = (ThreadPoolExecutor) executorFilter.getExecutor();
final ThreadFactory threadFactory = new NamedThreadFactory(name + "-thread-", eventExecutor.getThreadFactory(), true, null);
eventExecutor.setThreadFactory(threadFactory);
// Construct a new socket acceptor, and configure it.
socketAcceptor = buildSocketAcceptor();
if (JMXManager.isEnabled()) {
configureJMX(socketAcceptor, name);
}
final DefaultIoFilterChainBuilder filterChain = socketAcceptor.getFilterChain();
filterChain.addFirst(ConnectionManagerImpl.EXECUTOR_FILTER_NAME, executorFilter);
// Add the XMPP codec filter
filterChain.addAfter(ConnectionManagerImpl.EXECUTOR_FILTER_NAME, ConnectionManagerImpl.XMPP_CODEC_FILTER_NAME, new ProtocolCodecFilter(new XMPPCodecFactory()));
// Kill sessions whose outgoing queues keep growing and fail to send traffic
filterChain.addAfter(ConnectionManagerImpl.XMPP_CODEC_FILTER_NAME, ConnectionManagerImpl.CAPACITY_FILTER_NAME, new StalledSessionsFilter());
// Ports can be configured to start connections in SSL (as opposed to upgrade a non-encrypted socket to an encrypted one, typically using StartTLS)
if (configuration.getTlsPolicy() == Connection.TLSPolicy.legacyMode) {
final SslFilter sslFilter = encryptionArtifactFactory.createServerModeSslFilter();
filterChain.addAfter(ConnectionManagerImpl.EXECUTOR_FILTER_NAME, ConnectionManagerImpl.TLS_FILTER_NAME, sslFilter);
}
// Throttle sessions who send data too fast
if (configuration.getMaxBufferSize() > 0) {
socketAcceptor.getSessionConfig().setMaxReadBufferSize(configuration.getMaxBufferSize());
Log.debug("Throttling read buffer for connections to max={} bytes", configuration.getMaxBufferSize());
}
// Start accepting connections
socketAcceptor.setHandler(connectionHandler);
socketAcceptor.bind(new InetSocketAddress(configuration.getBindAddress(), configuration.getPort()));
} catch (Exception e) {
System.err.println("Error starting " + configuration.getPort() + ": " + e.getMessage());
Log.error("Error starting: " + configuration.getPort(), e);
// Reset for future use.
if (socketAcceptor != null) {
try {
socketAcceptor.unbind();
} finally {
socketAcceptor = null;
}
}
}
}
Aggregations