Ожидание не более X секунд для асинхронных EJB - PullRequest
0 голосов
/ 12 января 2012

У меня есть «клиент» EJB, который вызывает 4 Asynchronous EJB с и должен дать им все 5 секунд для запуска. Через 5 секунд «клиентский» EJB собирает результаты готовности из Future объекта, который завершил работу, и возвращает вывод.

У меня проблема с "ожиданием" в клиентской части. Я пытался вызвать future.get(5, TimeUnit.MILLISECONDS) Иногда кажется, что async EJB s начинает работать после тайм-аута. Есть ли правильный способ сделать это?

1) Соберите Future объектов в Map:

    Map<String, Future> futureMap = new HashMap<String, Future>();
    for (String userID: users) {
            Future<Set<FrontPageData>> test = util.asyncGetData(userID);
            futureMap.put(serviceID, test);

    }
    return futureMap;

2) Затем я получаю вывод с таймаутом от Future объектов

    final long now = Calendar.getInstance().getTimeInMillis();
    final long end = now + TimeUnit.SECONDS.toMillis(5)
    Map<String, Object> output = new HashMap<String, Object>();
    Object data;
    for (String userID: futureMap.keySet()) {
        Future future= futureMap.get(userID);
        try {
            //check how much time left till the end
            long timeout = end - Calendar.getInstance().getTimeInMillis();
            data = future.get(timeout, TimeUnit.MILLISECONDS);
            output.put(userID, data);
        } catch (Exception e) {//write to logs
        } 
    }
    return output;
}

спасибо

1 Ответ

0 голосов
/ 12 января 2012

Я не думаю, что ваш клиент должен знать подробности, нужно ли еще планировать асинхронный код или он работал в течение этих 5 секунд.

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

Если вы хотите ограничить фактическое время выполнения 5 секундами, единственный реалистичный способ - сделать это в бине, который выполняет код.

приписка

Не относится к вашему вопросу, но почему этот странный расчет для тайм-аута? Теперь вы делаете «сейчас + 5 секунд - сейчас», что снова составляет 5 секунд.

И, если вы перебираете карту и нуждаетесь как в значении, так и в ключе, вы можете перебирать набор записей вместо набора ключей, а затем делать get() для каждого ключа.

...