如何在异常后在java中重新生成一个thrift服务器?

时间:2009-04-15 13:46:52

标签: java process thrift

我是java的新手,并在java中编写了一个小但非常重要的thrift服务。

我注意到它偶尔会在没有任何错误消息的情况下停止服务;似乎java进程随机死亡,没有堆栈跟踪或异常。

即使发生错误,确保此过程保持活跃的最佳方法是什么?这是主要功能,如果有帮助:

public static void main(String [] args) {
    try {
        MyAppServiceHandler handler = new MyAppServiceHandler();
        MyApp.Processor processor = new MyApp.Processor(handler);
        TServerTransport serverTransport = new TServerSocket(8080);
        TServer server = null;
        server = new TSimpleServer(processor, serverTransport);
        System.out.println("Starting thrift server...");
        server.serve();
    }
    catch (TTransportException e) {
        e.printStackTrace();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

2 个答案:

答案 0 :(得分:1)

我已经改为更好的解决方案了。

我在java中的main函数如下所示:

public static void main(String [] args) {
    try {
      MyAppServiceHandler handler = new MyAppServiceHandler();
      MyApp.Processor processor = new MyApp.Processor(handler);
      TServerTransport serverTransport = new TServerSocket(8080);
      TServer server = null;
      server = new TSimpleServer(processor, serverTransport);
      System.out.println("Starting thrift server...");
      server.serve();
    }
    catch (TTransportException e) {
      e.printStackTrace();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
}

这使得服务器死机,这与我原来的解决方案所需要的相反。但是,java进程/服务器现在从Supervisor启动,它会密切关注进程并在其死亡时重新生成它,而原始解决方案(使用while循环)将使服务器保持活动但打印堆栈跟踪如果连接到端口时出现问题,则会遗漏这些错误消息。

答案 1 :(得分:0)

如果对服务的调用阻止,您可以执行以下操作:

public static void main(String [] args) {
   while(true){
    try {
        MyAppServiceHandler handler = new MyAppServiceHandler();
        MyApp.Processor processor = new MyApp.Processor(handler);
        TServerTransport serverTransport = new TServerSocket(8080);
        TServer server = null;
        server = new TSimpleServer(processor, serverTransport);
        System.out.println("Starting thrift server...");
        server.serve();
    }
    catch (TTransportException e) {
        e.printStackTrace();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    //do cleanup
  }
}