В нашем приложении калитки мне нужно запустить длительную операцию.Он свяжется с внешним устройством и выдаст результат через некоторое время (до нескольких минут).
С точки зрения Java, длительная операция запускается методом, в котором я могу предоставить обратный вызов.
public interface LegacyThingy {
void startLegacyWork(WorkFinished callback);
}
public interface WorkFinished {
public void success(Whatever ...);
// failure never happens
}
На своей странице калитки я планирую добавить кнопку Ajax для вызова startLegacyWork(...)
, обеспечивающего соответствующий обратный вызов.Для результата я бы отобразил панель, которая опрашивает результат, используя AbstractTimerBehavior.
Меня поражает следующая проблема:
Чтобы сохранить состояние, Wicket сериализует дерево компонентов вместе сданные, таким образом, данные должны быть заключены в сериализуемые модели (или съемные модели).
Таким образом, чтобы сохранить «связь» между панелью результатов и обратным вызовом WorkFinished, мне понадобится какой-то способ создать связь междумир Wicket «мы все сериализуем» и мир устаревшего интерфейса «Эй, я объект Java, и никто не управляет моей жизнью».
Конечно, я могу хранить текущие операции в виде глобальной карты.и используйте съемную модель Wicket, которая ищет их по идентификатору ... но кажется грязной, и я не думаю, что это правильный путь.(Это открывает целую банку червей относительно срока службы таких вещей.)
Или я смотрю под совершенно неверным углом зрения на то, как выполнять длительные операции из калитки?