Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Future, exception и isDone / 16 сообщений из 16, страница 1 из 1
22.01.2013, 18:33:35
    #38120262
rabiter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Future, exception и isDone
Добрый вечер, коллеги.

Просветите меня плиз, как быть с Future:
Future<UUID> result = callAsync(parameters);

Завершил выполнение метод callAsync или нет - я решаю по result.isDone();
Но вот проблема, если callAsync выбросил исключение, то isDone всегда будет возвращать false;
И узнать о том, что метод бросил исключение можно будет только попробовав выполнить result.get(), что чревато ожиданием.
Я вижу два очевидных обхода:
1.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
UUID uuidResult = null;
if (!result.isDone()) {
        try {
            // попытка номер два, вдруг было исключение и выполнение уже закончено
            uuidResult = result.get(1, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
        } catch (ExecutionException e) {
        } catch (TimeoutException e) {
        }  
}


т.е. вызывать get с таймером
Целый букет исключений, и вообще не красиво.

2. Переписать callAsync так, чтобы он вообще не бросал исключений. А если исключение возникло, то передавать его в параметре Future:
Код: java
1.
Future<ResultHolder> result = callAsync(parameters);


Где ResultHolder содержит исключение (если было) и результат.

Оба варианта не нравятся, хотя второй еще ничего. Но Future мне использовать надо, потому что я использую метод EJB бина аннотированный как javax.ejb.Asynchronous, который либо ничего не должен возвращать, либо должен возвращать Future.

Вот думаю, может какую-нибудь другую потокобезопасную структуру вообще использовать?
...
Рейтинг: 0 / 0
22.01.2013, 18:40:20
    #38120276
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Future, exception и isDone
Мне кажется, вопрос немного не по адресу.

Модератор: Тема перенесена из форума "Работа".
...
Рейтинг: 0 / 0
22.01.2013, 18:53:28
    #38120305
rabiter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Future, exception и isDone
softwarer,

Ой, я что, а работе запостил? Прошу прощения :-)
...
Рейтинг: 0 / 0
22.01.2013, 18:54:26
    #38120309
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Future, exception и isDone
rabiterНо вот проблема, если callAsync выбросил исключение, то isDone всегда будет возвращать false;

Это не правильно. Посмотрите FutureTask - если выкидывается исключение, то статус меняется на RAN, соответсвенно isDone() должен вернуть true.

rabiterОба варианта не нравятся, хотя второй еще ничего. Но Future мне использовать надо, потому что я использую метод EJB бина аннотированный как javax.ejb.Asynchronous, который либо ничего не должен возвращать, либо должен возвращать Future.

GlassFish небось? Покажите что у вас в callAsync()
...
Рейтинг: 0 / 0
22.01.2013, 18:56:29
    #38120314
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Future, exception и isDone
Если у вас именно callAsync выбросит исключение, то переменная result окажется вообще вне scope.
Покажите более конкретный код что вы и как запускаете.
...
Рейтинг: 0 / 0
22.01.2013, 19:12:09
    #38120337
rabiter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Future, exception и isDone
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    @Asynchronous
    public Future<UUID> perform(ExportDefinition exporter) throws ClientException {
        UUID uuid = null;
        try {
            // различного рода манипуляции для того чтобы получить этот uuid
            // на самом деле тут идет генерация отчетов, может минут 30 работать
        } catch (DocumentException ex) {
              throw ClientException.wrap(ex);
        } catch (Exception ex) {
              throw ClientException.wrap(ex);
        }
        return new AsyncResult<UUID>(uuid);
    }



И вызов:

Код: java
1.
        Future<UUID> result = exportService.perform(exporter);



по сути, потом result сохраняется в глобальной мапе. Клиент использует периодический polling чтобы проверить, появились ли новые отчеты. Каждый такой запрос от клиента ищет в этой мапе отчеты на свое имя и проверяет у них isDone.
Там у меня используется имплементация Future AsyncResult а не FutureTask, так вот она в случае исключения isDone не выставляет в true. Я сейчас попробую использовать FutureTask, но не уверен что в случае с методом EJB можно выбирать между альтернативными имплементациями.
...
Рейтинг: 0 / 0
22.01.2013, 19:12:35
    #38120338
rabiter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Future, exception и isDone
И да, используем glassfish)
...
Рейтинг: 0 / 0
22.01.2013, 19:15:13
    #38120339
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Future, exception и isDone
rabiterИ да, используем glassfish)
Тогда удивлятся нечему. На этом форуме на него каждую неделю жалуются.
...
Рейтинг: 0 / 0
22.01.2013, 19:17:00
    #38120343
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Future, exception и isDone
http://docs.oracle.com/javaee/6/tutorial/doc/gkkqg.html The isDone method returns true if the asynchronous method invocation completed normally, was cancelled, or resulted in an exception .
Возьмите JBoss - не мучайтесь.
...
Рейтинг: 0 / 0
22.01.2013, 19:18:19
    #38120344
rabiter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Future, exception и isDone
Blazkowicz,

Вау. Спасибо :-) Эх)
...
Рейтинг: 0 / 0
22.01.2013, 19:19:23
    #38120349
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Future, exception и isDone
...
Рейтинг: 0 / 0
22.01.2013, 19:24:38
    #38120359
rabiter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Future, exception и isDone
Blazkowicz,

О да, спасибо) Но на фоне глюков JSF и ICEFaces с которыми приходится каждый день сталкиваться, это ничто)
...
Рейтинг: 0 / 0
22.01.2013, 19:28:29
    #38120364
rabiter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Future, exception и isDone
rabiter,

Вы знаете, но у меня isDone стал возвращать true, т.е. все как надо. Что-то я где-то видно намудрил.
Но в инете есть на эту тему посты
http://stackoverflow.com/questions/7689624/futurev-and-exception] http://stackoverflow.com/questions/7689624/futurev-and-exception
...
Рейтинг: 0 / 0
22.01.2013, 19:33:46
    #38120368
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Future, exception и isDone
rabiter http://stackoverflow.com/questions/7689624/futurev-and-exception] http://stackoverflow.com/questions/7689624/futurev-and-exception
Странно что там isDone вообще никто не упоминает.
...
Рейтинг: 0 / 0
22.01.2013, 19:34:25
    #38120370
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Future, exception и isDone
rabiterВы знаете, но у меня isDone стал возвращать true, т.е. все как надо. Что-то я где-то видно намудрил.

А есть разница если вызывать через Local или Remote интерфейсы?
...
Рейтинг: 0 / 0
22.01.2013, 19:40:54
    #38120375
rabiter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Future, exception и isDone
Blazkowiczrabiter http://stackoverflow.com/questions/7689624/futurev-and-exception] http://stackoverflow.com/questions/7689624/futurev-and-exception
Странно что там isDone вообще никто не упоминает.

Да, странно. Но в первом ответе рекомендуют попробовать get после isDone

авторА есть разница если вызывать через Local или Remote интерфейсы?

Вы знаете, я весьма смутно понимаю, что такое Remote вызов бина. Я вызываю как Local.
Если мне надо будет вызывать что-то удаленно, я сделаю WS. Вы пользовались когда-нибудь Remote бинами, это удобно?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Future, exception и isDone / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]