【问题标题】:How can I re-spawn a thrift server in java after an exception?发生异常后如何在java中重新生成一个thrift服务器?
【发布时间】:2010-10-19 14:27:20
【问题描述】:

我是 Java 新手,并且在 Java 中编写了一个小但非常重要的节俭服务。

我注意到有时它会停止服务而没有任何错误消息;似乎 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();
    }
}

【问题讨论】:

  • 你得到了什么异常,代码的哪一部分?
  • 我没有看到任何异常,这就是我问的原因。它在一个无头系统上,服务连续运行,错误是零星的,所以没有太多反馈。

标签: java process thrift


【解决方案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 循环)将使服务器保持活动状态,但如果存在则打印堆栈跟踪是连接到端口的问题,这些错误消息将被遗漏。

【讨论】:

    【解决方案2】:

    如果对服务的调用被阻塞,你可以这样做:

    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
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      相关资源
      最近更新 更多