Шаблон проектирования для реализации тайм-аутов - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь разработать логику тайм-аута операций для своего сервиса.Каждая операция взаимодействует (синхронизируется и асинхронно) с несколькими нисходящими сервисами.Цель состоит в том, чтобы иметь возможность завершить операцию через определенное время независимо от состояния.

Существует ли какой-либо шаблон проектирования, который можно использовать в решении?

1 Ответ

0 голосов
/ 18 февраля 2019

Вы можете использовать Future для доступа к вашим нисходящим сервисам, а затем использовать какой-то подход, основанный на событиях, для обработки успеха / тайм-аутов.

public interface ICallback {

    public void onSuccess(DsObject object);

    public void onTimeout();
}

Способ доступа к вашим нисходящим сервисамможет выглядеть так:

public class DownstreamConnector implements Callable<DsObject> {

    @Override
    public DsObject call() {
        // Invoke your downstream services here
        return ...
    }
}

Затем вы можете обернуть вызываемый элемент в Future<>, чтобы вызвать ваши нисходящие сервисы и проверить время ожидания.

final ICallback callback = new MyCallbackHandler();
final DownstreamConnector connector = new DownstreamConnector()

ExecutorService executor = ...
Future<DsObject> future = executor.submit(connector);

try {
    DsObject result = future.get(TIMEOUT, TimeUnit.MILISECONDS);

    // Operation completed
    callback.onSuccess(result);
} catch (TimeoutException ex) {
    logger.error("Operation timed out", ex);
    future.cancel(true);

    // Timed out
    callback.onTimeout();
}

Просто комментарий: future.cancel(true); действительно не останавливает выполняющуюся базовую задачу, он просто устанавливает для флага прерывания значение true для запущенного потока.Именно ваш код отвечает за проверку этого флага и выдаёт InterruptedException, если это правда.


...