package net.notdot.bdbdatastore.server; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.InetSocketAddress; import java.util.concurrent.Executors; import net.notdot.protorpc.ProtoRpcPipelineFactory; import org.jboss.netty.bootstrap.ServerBootstrap; import org.jboss.netty.channel.ChannelFactory; import org.jboss.netty.channel.group.ChannelGroup; import org.jboss.netty.channel.group.ChannelGroupFuture; import org.jboss.netty.channel.group.DefaultChannelGroup; import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.sleepycat.je.DatabaseException; import com.sleepycat.je.EnvironmentLockedException; public class DatastoreServer { static final Logger logger = LoggerFactory.getLogger(DatastoreServer.class); private static Datastore datastore; private static ChannelFactory factory; private static ChannelGroup openChannels = new DefaultChannelGroup("DatastoreServer"); public static TypedProperties properties = new TypedProperties(); /** * @param args * @throws IOException * @throws DatabaseException * @throws EnvironmentLockedException */ public static void main(String[] args) throws IOException, EnvironmentLockedException, DatabaseException { if(args.length != 1) { System.out.println(String.format("Usage: DatastoreServer <datastoredir>")); return; } String datastore_path = args[0]; File prop_path = new File(datastore_path, "datastore.properties"); if(prop_path.exists()) properties.load(new FileInputStream(prop_path)); datastore = new Datastore(datastore_path); Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { logger.info("Shutting down."); ChannelGroupFuture future = openChannels.close(); future.awaitUninterruptibly(); datastore.close(); factory.releaseExternalResources(); } }); int max_pb_size = properties.getInt("datastore.max_pb_size", 1048576); factory = new NioServerSocketChannelFactory( Executors.newCachedThreadPool(), Executors.newCachedThreadPool()); ServerBootstrap bootstrap = new ServerBootstrap(factory); DatastoreServiceFactory ds_factory = new DatastoreServiceFactory(datastore); bootstrap.setPipelineFactory(new ProtoRpcPipelineFactory(ds_factory, openChannels, max_pb_size)); bootstrap.bind(new InetSocketAddress(properties.getInt("datastore.port", 9123))); logger.info("Server started. debug=" + logger.isDebugEnabled()); } }