2014-01-13 2 views
0

Я работаю над проектом, в котором я должен выполнять поведение моего клиента. и asynchronous. В общем, как наш клиент будет работать, как показано ниже -Эффективный способ синхронного и асинхронного поведения в приложении

Клиент позвонит нашему клиенту с userId и мы построим URL из этого userId и сделать HTTP вызов к этому URL, и мы получим JSON строку назад после удара URL. И после того, как мы получим ответ как JSON String, мы отправим эту JSON String обратно нашему клиенту.

Таким образом, в этом случае, как я уже упоминал выше, мне нужно иметь 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; 
    } 
} 

Это правильный и эффективный способ сделать эту проблему? А как насчет обработки исключений? Нужны ли мне какие-либо другие блоки catch в любом месте? Если есть, то только пример кода высокого уровня поможет мне лучше понять.

Если есть лучший путь, то пожалуйста, дайте мне знать ... Я все еще учусь ..

ответ

1

Я бы реализовать executeSynchronous таким образом:

public String execute(String userId){ 
    Task task = new Task(userID); 
    return task.call();  //Task executes in the caller thread 
} 

Я бы не использовать исполнение поскольку вызов должен выполняться в потоке вызывающего абонента. Bu думаю, что вы хотели бы предоставить механизм тайм-аута в синхронном методе, чтобы вызывающий абонент не блокировался. Если нет, я думаю, что нет необходимости использовать среду выполнения в синхронном методе.

Смежные вопросы