/*
* Copyright 2013 Sylvain LAURENT
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ch.sla.jdbcperflogger.logger;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.AccessController;
import java.security.PrivilegedAction;
import ch.sla.jdbcperflogger.Logger;
class PerfLoggerServerThread extends Thread {
private final static Logger LOGGER = Logger.getLogger(PerfLoggerServerThread.class);
ServerSocket serverSocket;
boolean done;
static PerfLoggerServerThread spawn(final int serverPort) {
// avoid Classloader leaks
return AccessController.doPrivileged(new PrivilegedAction<PerfLoggerServerThread>() {
@Override
public PerfLoggerServerThread run() {
final ClassLoader savedClassLoader = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(null);
final PerfLoggerServerThread thread = new PerfLoggerServerThread(serverPort);
thread.start();
return thread;
} finally {
Thread.currentThread().setContextClassLoader(savedClassLoader);
}
}
});
}
private PerfLoggerServerThread(final int serverPort) {
this.setDaemon(true);
this.setName("PerfLoggerServer acceptor port " + serverPort);
try {
serverSocket = new ServerSocket(serverPort);
} catch (final IOException e) {
throw new RuntimeException(e);
}
}
@Override
public void run() {
try {
while (!done) {
try {
final Socket socket = serverSocket.accept();
LOGGER.debug("Got client connection from " + socket);
final SocketLogSender sender = new SocketLogSender(socket);
final Thread logSenderThread = new Thread(sender, "PerfLoggerServer " + socket.getInetAddress()
+ ":" + socket.getPort());
logSenderThread.setDaemon(true);
logSenderThread.start();
PerfLoggerRemoting.senders.add(sender);
} catch (final IOException e) {
LOGGER.error("error while accepting socket", e);
}
}
} finally {
try {
serverSocket.close();
} catch (final IOException e) {
LOGGER.error("error while closing socket", e);
}
}
}
}