我正在开展一个项目,我应该在其中对我的客户进行synchronous
和asynchronous
行为。一般来说,我们的客户如何工作如下 -
客户将使用userId
呼叫我们的客户,我们将从userId
构建一个URL并对该URL进行HTTP调用,我们将在点击URL后返回一个JSON字符串。在我们将响应作为JSON字符串返回之后,我们将该JSON字符串发送回给我们的客户。
所以在这种情况下,正如我上面提到的,我需要synchronous
和asynchronous
方法,有些客户会调用executeSynchronous
方法来获得相同的功能,而某些客户会调用我们的executeAsynchronous
方法可以获取数据。
以下是我的界面 -
public interface Client {
// for synchronous
public String executeSynchronous(final String userId);
// for asynchronous
public Future<String> executeAsynchronous(final String userId);
}
然后我的SmartClient
实现了上面的Client
接口。
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> handle = getHandle(userId);
try {
response = handle.get(500, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
}
return response;
}
// This is for asynchronous call
@Override
public Future<String> executeAsync(String userId) {
return getHandle(userId);
}
private Future<String> getHandle(String userId) {
Future<String> future = null;
Task task = new Task(userId);
future = executor.submit(task);
return future;
}
}
下面是我将执行实际任务的简单类 -
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 :(得分:1)
我会以这种方式实现 executeSynchronous :
public String execute(String userId){
Task task = new Task(userID);
return task.call(); //Task executes in the caller thread
}
我不会使用执行框架,因为调用应该在调用者线程中执行。你认为你的意思是在同步方法中提供一个超时机制,这样调用者就不会被阻塞。如果不是,我认为不需要在同步方法中使用执行框架。