启动时在Finagle Server中运行异步线程的最佳方法

时间:2015-02-19 07:48:54

标签: java multithreading server finagle

我开始使用Java中的Finagle库并尝试使用JSON进行通信的几个基本HTTP服务。 让这成为主服务和奴隶服务。

主服务具有以下逻辑:

  • 它在启动时运行一个线程,它向从站发送命令请求
  • 它会侦听来自
  • 的错误/成功报告

从服务器的逻辑是:

  • 对于收到的命令,它会立即发送确认。
  • 然后它启动一个线程来执行命令指定的任务。
  • 它将作业(或错误)的结果以JSON格式发送回master。

我有以下代码:

HttpMuxer muxService = new HttpMuxer().withHandler("/", new MasterService());
ListeningServer server = Http.serve(new InetSocketAddress("localhost", 8000), muxService);

// This method runs a Function0 closure in a Future pool.
// It sends requests to slave, and exits after the commands are sent.
sendCommands();

try {
    Await.ready(server);
} catch (TimeoutException e) {
    e.printStackTrace();
} catch (InterruptedException e) {
    e.printStackTrace();
}  

我的问题是:
现在,理想情况下,这项工作可能需要几秒钟才能完成。但是如果出现错误,它几乎可以立即向master报告错误报告。一旦我拨打sendCommands(),我就可以期待奴隶尝试联系主人。

只有拨打Http.serve(),服务器才能启动并收听吗?或者这是在Await.ready()电话中发生的吗? 我假设后者,并在由Thread.sleep()生成的线程中放置sendCommands()。这需要吗?
另外,还有一种更好的方法可以在主服务器上干净地启动此命令发出线程吗?

1 个答案:

答案 0 :(得分:0)

好的,经过一些测试,我发现了这一点。

Http.serve()的调用启动给定端口上的服务器,传入的请求由MasterService正确处理

Await.ready()循环只是让线程保持活动状态。即使您使用Thread.sleep(n)

替换它,服务器也会响应