我正在开展一个项目,我应该在其中对我的客户进行synchronous
和asynchronous
行为。一般来说,我们的客户如何工作如下 -
客户将使用userId
呼叫我们的客户,我们将从userId
构建一个URL并对该URL进行HTTP调用,我们将在点击URL后返回一个JSON字符串。在我们将响应作为JSON字符串返回之后,我们将该JSON字符串发送回给我们的客户。
所以在这种情况下,正如我上面提到的,我需要synchronous
和asynchronous
方法,有些客户会调用synchronous
方法来获取相同的功能,有些会调用我们的asynchronous
方法来获取数据。
所以现在我在想,在同一个客户端代码中实现synchronous
和asynchronous
功能的最佳方法是什么。我知道可能有不同的答案取决于人们如何实现,但作为开发人员,可能有更好的方式来实现它作为我目前的方式。
我还在学习,所以想知道更好的方法,我也可以告诉其他人要解决这些问题,你需要这样做。
现在,我已经创建了一个这样的界面 -
public interface Client {
// for synchronous
public String execute(final String userId);
// for asynchronous
public Future<String> executeAsync(final String userId);
}
然后我有SmartClient
实现上述Client
接口。我不确定我是应该这样做还是有更好的方法来实现同步和异步功能。
下面是我的SmartClient
代码及其中的其他高级代码,我认为这些代码足以理解整个流程。
public class SmartClient implements Client {
ExecutorService executor = Executors.newFixedThreadPool(5);
// This is for synchronous call
@Override
public String execute(String userId) {
String response = null;
Future<String> future = executor.submit(new Task(userId));
try {
response = future.get(3, TimeUnit.SECONDS);
} catch (TimeoutException e) {
System.out.println("Terminated!");
}
return response;
}
// This is for asynchronous call
@Override
public Future<String> executeAsync(String userId) {
// not sure what should I do here as well?
}
}
下面是我将执行实际任务的简单类 -
class Task implements Callable<String> {
private final String userId;
public Task(String userId) {
this.userId = userId;
}
public String call() throws Exception {
String url = createURL(userId);
// make a HTTP call to the URL
RestTemplate restTemplate = new RestTemplate();
String jsonResponse = restTemplate.getForObject(url , String.class);
return jsonResponse;
}
// create a URL
private String createURL(String userId) {
String generateURL = somecode;
return generateURL;
}
}
但我正在做一些研究,我发现更好的方法是 -
而不是两个方法,一个是同步的,另一个是 异步,有一个描述同步的接口方法 行为。为它编写实现。然后提供一个包装器 包含你的接口实现的类 基本上在提供时调用包装对象的方法 异步行为。
但不知怎的,我无法理解如何实现这一目标?任何人都可以在我的例子中提供一个简单的示例基础,这将有助于我更好地理解如何做到这一点吗?
我或许可以通过这种方式学到新东西。
答案 0 :(得分:0)
试试这个
@Override
public Future<String> executeAsync(String userId) {
return executor.submit(new Task(userId));
}