Как обрабатывать сериализацию при использовании рабочего потока из калитки? - PullRequest
2 голосов
/ 28 марта 2012

В нашем приложении калитки мне нужно запустить длительную операцию.Он свяжется с внешним устройством и выдаст результат через некоторое время (до нескольких минут).

С точки зрения 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, которая ищет их по идентификатору ... но кажется грязной, и я не думаю, что это правильный путь.(Это открывает целую банку червей относительно срока службы таких вещей.)

Или я смотрю под совершенно неверным углом зрения на то, как выполнять длительные операции из калитки?

1 Ответ

2 голосов
/ 29 марта 2012

Я думаю, что подход с глобальной картой хорош. Wicket также использует нечто подобное внутри - org.apache.wicket.protocol.http.StoredResponsesMap. Это специальная карта, в которой хранятся сгенерированные ответы для стратегии REDIRECT_TO_BUFFER. Он имеет логику для хранения записей не более некоторой предварительно настроенной продолжительности, а также может иметь верхний предел записей.

...