Background:个
我正在创建我想要开源的库.
该库设计用于后端进程.
我将提供的服务利用Java的ProcessBuilder
来执行几个本机命令.
此服务通常在1秒内完成命令处理,但在极少数情况下,可能需要几分钟.
Questions:个
在公共库具有可能被阻塞的方法的情况下,该库是否应该提供用于调用该方法的异步选项?或者,这样的库应该保持不变,让用户来实现吗?
以下是我一直在考虑如何实现这项服务的几种方式……
Example 1: unopinionated个
-
SomeService
,采用阻塞方法 - 如果用户想要异步运行,他们必须弄清楚
SomeService.java
public class SomeService {
public Response process(Request request) {
//do stuff for 60 seconds
}
}
Example 2: opinionated个
-
SomeService
,采用阻塞方法 - 可选的
SomeProcessTask
,用户可以使用它绕过阻塞方法并运行异步.
SomeProcessTask.java
public class SomeProcessTask implements Callable<Response> {
private final Request request;
public SomeProcessTask(Request request) {
this.request = request;
}
@Override
public Response call(Request request) {
//do stuff for 60 seconds
}
}
SomeService.java
public class SomeService {
public Response process(Request request) {
SomeProcessTask task = new SomeProcessTask(request);
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Response> future = executor.submit(task);
return future.get();
}
}