BgpManager Initial commit
[vpnservice.git] / bgpmanager / bgpmanager-impl / src / main / java / org / opendaylight / bgpmanager / thrift / server / implementation / BgpThriftService.java
diff --git a/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/bgpmanager/thrift/server/implementation/BgpThriftService.java b/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/bgpmanager/thrift/server/implementation/BgpThriftService.java
new file mode 100644 (file)
index 0000000..06c353e
--- /dev/null
@@ -0,0 +1,110 @@
+package org.opendaylight.bgpmanager.thrift.server.implementation;
+
+import org.apache.thrift.server.THsHaServer;
+import org.apache.thrift.server.TServer;
+import org.apache.thrift.server.TSimpleServer;
+import org.apache.thrift.server.TThreadPoolServer;
+import org.apache.thrift.transport.*;
+import org.opendaylight.bgpmanager.thrift.common.Constants;
+import org.opendaylight.bgpmanager.thrift.gen.BgpUpdater;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BgpThriftService {
+       
+       private static final Logger logger = LoggerFactory.getLogger(BgpThriftService.class);
+       
+       private int port;
+       //private int serverType;
+       private int maxWorkerThreads;
+       private int minWorkerThreads;
+    private TServerTransport serverTransport;
+       //private TNonblockingServerTransport serverTransport;
+    private TServer server;
+       private BgpUpdateHandler notificationHandler;
+    
+    public BgpThriftService() {
+       
+    }
+
+
+       public void start() {
+               logger.info("BGP Thrift Server starting.");
+               startBgpThriftServer();
+       }
+       
+       public void stop() {
+               logger.info("BGP Thrift Server stopping.");
+               stopBgpThriftServer();
+       }
+
+       /**
+        * Destroy method called up after the bundle has been stopped
+        */
+       public void destroy() {
+               logger.debug("BGP Thrift Server destroy ");
+       }
+
+    /**
+     * Loading the parameters required for a connection
+     * 
+     */
+    private void loadParameters() {
+        port = Integer.getInteger(Constants.PROP_BGP_THRIFT_PORT, Constants.BGP_SERVICE_PORT);
+               maxWorkerThreads = Integer.getInteger(Constants.PROP_MAX_WORKER_THREADS,
+                       Constants.DEFAULT_MAX_WORKER_THREADS);
+               minWorkerThreads = Integer.getInteger(Constants.PROP_MIN_WORKER_THREADS,
+                       Constants.DEFAULT_MIN_WORKER_THREADS);
+
+       }
+
+
+       public void startBgpThriftServer() {
+               loadParameters();
+               new Thread(new ThriftRunnable()).start();
+       }
+
+       public void stopBgpThriftServer() {
+               try {
+            logger.debug("Server stopping");
+
+            if (serverTransport != null) {
+                serverTransport.close();
+            }
+            
+            server.stop();
+        } catch (Exception e) {
+            logger.error("Error while stopping the server - {} {}", getClass().getName(), e.getMessage());
+        }
+       }
+       
+       private class ThriftRunnable implements Runnable {
+               @Override
+               public void run() {
+                       notificationHandler = new BgpUpdateHandler();
+
+               try {
+                               serverTransport = new TServerSocket(port);
+                               //serverTransport = new TNonblockingServerSocket(port);
+                   logger.info("Server Socket on Port {} ", port);
+                       } catch (TTransportException e) {                       
+                               e.printStackTrace();
+                               return;
+                       }
+                       /* This may need to change. Right now, its as good as a blocking server for each client (client would be
+                       single - qbgp). We may want to change the server to TSimpleServer which queues up the notifications and
+                       let worker threads process notifications based on rd.
+                        */
+               server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport)
+                       .maxWorkerThreads(maxWorkerThreads).minWorkerThreads(minWorkerThreads)
+                       .processor(new BgpUpdater.Processor<BgpUpdateHandler>(notificationHandler)));
+                       /*
+                       THsHaServer.Args args = new THsHaServer.Args(serverTransport);
+                       args.workerThreads(10);
+                       server = new THsHaServer(args.processor(new BgpUpdater.Processor<BgpUpdateHandler>(notificationHandler)));*/
+
+                       server.serve();
+               }               
+       }
+
+}