2012-04-23 2 views
1

Мне нужно приложение для отправки данных в веб-службу и ждать ответа на 90 секунд. Но если в течение 60 секунд нет ответа, мне нужно перенаправить пользователя на другую страницу и продолжать ждать ответа еще на 30 секунд, если это произойдет, а затем обработайте его. Я знаю, что мне нужно использовать поток для этого, но не уверен, как интегрировать протектор в этом случае, так что потоки могут обмениваться данными между собой.Передача данных между потоками в Java?

Любые идеи? Я использую JSF для пользовательского интерфейса.

Требование следующее: веб-служба отправит ответ в течение 90 секунд (это максимальное время отклика для него). Но пользователю будет дан ответ (фиктивный ответ в случае, если ответ не достигнет 60 секунд) через 60 секунд. Так что даже если пользователю был дан фиктивный ответ (через 60 секунд) мое приложение будет продолжать ждать еще 30 секунд для ответа

+0

https://www.youtube. com/watch? v = 378DHU9IsS4 – clstaudt

+1

«нужно перенаправить пользователя на другую страницу и продолжать ждать ответа» - что это значит? Либо вы можете перенаправить Java-приложение (так что приложение java является клиентом), либо есть какая-то связь через браузер? Пожалуйста, уточните – Dewfy

+0

Возможно, вы должны воздерживаться от использования потоков в приложении, управляемом контейнером, поскольку управление потоками обычно выполняется контейнером. Я действительно не понимаю этот случай: подождите 60 секунд, затем перенаправляйте (почему? Для отзывов пользователей?), Подождите еще 30 секунд (а потом что?). Можете ли вы немного разобраться? – maksimov

ответ

1

Не знаю много о JSF, но похоже, что вы хотите таймер, вероятно, java.util.Timer. Если ответ вернется, прежде чем таймер погаснет, выключите таймер. Если таймер выключен, сбросьте его на 30 секунд и перенаправьте пользователя. В следующий раз, когда он погаснет, откажитесь от ответа на правильный ответ.

Что вы, кажется, понимаете. Но здесь есть как минимум два потока взаимодействующих потоков. Как общаться?

Просто используйте поля экземпляра. Все ссылки на них должны выполняться с помощью кода в методах или блоках synchronized. Сделай это, и с тобой все будет в порядке. Вам придется разобраться в этом, но я бы предположил, что у вас будет int timerPhase, что указывает на то, что таймер не запускался, в первые 60 секунд, в течение следующих 30 или не выполнялся. Также булевое answerReceived, что-то с ответом в нем и, возможно, несколькими другими.

(Слишком много синхронизации может замедлить вашу программу вниз. Я не думаю, что вы будете иметь эту проблему. Но если вы делаете, расколоть синхронизировать блоки вверх, с каждым полем синхронизированного отдельно, если они не взаимодействуют между собой. Удалить синхронизацию и используйте ключевое слово volatile. Прочитайте многопоточность (прочитайте ключевое слово volatile.) Подумайте о том, как могут взаимодействовать параллельные потоки. И подготовьтесь к тому, чтобы вещи стали реальными странными.)

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