I have to implement BDB replication for backup purpose. We cant afford to miss any commits. we do checkpoint every 2 mins but loosing even 2 mins of data can be catastrophic, therefore we are going to use a simple Java client that will open BDB as a replica and Master will sync every change to this guy and only then it will commit.
Now the challenge was to verify the replication I wanted to print something from this replica or I wanted to stop this replica gracefully. Implementing a shutdown hook wasn't working because kill -9 wasn't calling it and I have to implement some other operations on this Java client. Instead of juggling around with commandline or some RPC I used a simple Http server from Java.
private void init() {
InetSocketAddress addr = new InetSocketAddress(httpServerPort);
httpServer = HttpServer.create(addr, 0);
HttpContext context = httpServer.createContext("/", new AdminOpsHandler());
httpServer.setExecutor(Executors.newCachedThreadPool());
context.getFilters().add(new HttpParameterFilter());
httpServer.start();
logger.info("Server is listening on http port " + httpServerPort);
}
class AdminOpsHandler implements HttpHandler {
@SuppressWarnings("unchecked")
public void handle(HttpExchange exchange) throws IOException {
String requestMethod = exchange.getRequestMethod();
logger.info("Processing http request");
if (requestMethod.equalsIgnoreCase("GET")) {
Map params = (Map) exchange.getAttribute("parameters");
String command = (String) params.get("cmd");
Headers responseHeaders = exchange.getResponseHeaders();
exchange.sendResponseHeaders(200, 0);
PrintWriter responseBody = new PrintWriter(exchange.getResponseBody());
responseHeaders.set("Content-Type", "text/plain");
if ("stop".equals(command)) {
responseBody.write("Triggering stop of client");
logger.info("Triggering stop of client");
try {
cleanup();
} catch (ApplicationException e) {
throw new IOException(e);
}
} else if ("print".equals(command)) {
String workgroupId = (String) params.get("wgid");
responseBody.write("Printing workgroupId" + workgroupId);
}
responseBody.close();
}
}
}
The challenge was to fetch request parameters from the HttpExchange and then this post from a fellow programmer came handy. Looks like I am becoming Google programmer ;).
http://leonardom.wordpress.com/2009/08/06/getting-parameters-from-httpexchange/
Now the challenge was to verify the replication I wanted to print something from this replica or I wanted to stop this replica gracefully. Implementing a shutdown hook wasn't working because kill -9 wasn't calling it and I have to implement some other operations on this Java client. Instead of juggling around with commandline or some RPC I used a simple Http server from Java.
private void init() {
InetSocketAddress addr = new InetSocketAddress(httpServerPort);
httpServer = HttpServer.create(addr, 0);
HttpContext context = httpServer.createContext("/", new AdminOpsHandler());
httpServer.setExecutor(Executors.newCachedThreadPool());
context.getFilters().add(new HttpParameterFilter());
httpServer.start();
logger.info("Server is listening on http port " + httpServerPort);
}
class AdminOpsHandler implements HttpHandler {
@SuppressWarnings("unchecked")
public void handle(HttpExchange exchange) throws IOException {
String requestMethod = exchange.getRequestMethod();
logger.info("Processing http request");
if (requestMethod.equalsIgnoreCase("GET")) {
Map
String command = (String) params.get("cmd");
Headers responseHeaders = exchange.getResponseHeaders();
exchange.sendResponseHeaders(200, 0);
PrintWriter responseBody = new PrintWriter(exchange.getResponseBody());
responseHeaders.set("Content-Type", "text/plain");
if ("stop".equals(command)) {
responseBody.write("Triggering stop of client");
logger.info("Triggering stop of client");
try {
cleanup();
} catch (ApplicationException e) {
throw new IOException(e);
}
} else if ("print".equals(command)) {
String workgroupId = (String) params.get("wgid");
responseBody.write("Printing workgroupId" + workgroupId);
}
responseBody.close();
}
}
}
The challenge was to fetch request parameters from the HttpExchange and then this post from a fellow programmer came handy. Looks like I am becoming Google programmer ;).
http://leonardom.wordpress.com/2009/08/06/getting-parameters-from-httpexchange/
The main thread initializes the server and starts a number of worker threads that will handle client connections. The worker threads simply wait around idle until there's a client to service. The main thread then accepts connections from clients, passes off the connection for a worker thread to handle, and continues accepting new connections.
ReplyDelete