运行 在 Finagle 服务器中启动异步线程的最佳方式
Best way to run an asynchronous thread in a Finagle Server, on start up
我开始使用 Java 中的 Finagle 库,并尝试启动几个在 JSON 中通信的基本 HTTP 服务。
让这成为主从服务。
主服务具有以下逻辑:
- 它在启动时运行一个线程,向从机发送命令请求
- 它监听来自 slave
的 error/success 报告
从服务器的逻辑是这样的:
- 对于它收到的命令,它会立即发送一个ack。
- 然后它启动一个线程来执行命令指定的任务。
- 它在 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()
通话中?
我假设是后者,并在 sendCommands()
产生的线程中放置一个 Thread.sleep()
。这是必需的吗?
另外,是否有更好的方法来在主机上干净地启动此命令发布线程?
好的,经过一些测试我明白了。
对 Http.serve()
的调用在给定端口上启动服务器,传入请求由 MasterService
正确处理
Await.ready()
循环只是让线程保持活动状态。即使您将其替换为 Thread.sleep(n)
,服务器也会响应
我开始使用 Java 中的 Finagle 库,并尝试启动几个在 JSON 中通信的基本 HTTP 服务。
让这成为主从服务。
主服务具有以下逻辑:
- 它在启动时运行一个线程,向从机发送命令请求
- 它监听来自 slave 的 error/success 报告
从服务器的逻辑是这样的:
- 对于它收到的命令,它会立即发送一个ack。
- 然后它启动一个线程来执行命令指定的任务。
- 它在 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()
通话中?
我假设是后者,并在 sendCommands()
产生的线程中放置一个 Thread.sleep()
。这是必需的吗?
另外,是否有更好的方法来在主机上干净地启动此命令发布线程?
好的,经过一些测试我明白了。
对 Http.serve()
的调用在给定端口上启动服务器,传入请求由 MasterService
Await.ready()
循环只是让线程保持活动状态。即使您将其替换为 Thread.sleep(n)