Какие шаблоны Java / Design можно использовать для длительных синхронных процессов? - PullRequest
1 голос
/ 30 ноября 2010

Я сталкиваюсь с ситуацией на работе, похожей на ветку здесь .Разница в том, что мы не используем веб-сервис.Но скорее мы используем веб-приложение.У нас есть требование, позволяющее пользователю загружать 8000 записей по крайней мере с 30 столбцами, которые записываются в файл Excel через jxl.

Это длительный процесс, который не выполняется асинхронно по неизвестным мне причинам.Он также имеет огромный объем памяти ~ 500 - 800 МБ.В довершение всего, это занимает в среднем 2 минуты и 10 секунд.

В настоящее время мы выполняем делегирование этого требования вне процесса с сервера приложений через jms.Сервер приложений отправляет запрос посреднику, а затем потребитель получает запрос из очереди, обрабатывает его и отправляет обратно URL-адрес файла Excel.

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

Какие-либо предложения, шаблоны, которые можно сделать для дальнейшего улучшения этого процесса?

РЕДАКТИРОВАТЬ: Я, к сожалению, не могу покончить с "синхронностью", если вы можете позвонитьэто особенность, потому что это бизнес-требование.Поэтому я ищу ответы / твики / хитрости / шаблоны, которые могут повысить производительность и уменьшить использование динамической памяти процессом.

Ответы [ 2 ]

4 голосов
/ 30 ноября 2010

Правильно ли я понял?

  • Пользователь делает запрос. Во время этого запроса
    • отправлено сообщение JMS
    • файл Excel создан
    • возвращено сообщение JMS
    • и затем URL отправляется пользователю?

Если это так, я согласен, это ужасное злоупотребление асинхронной природой JMS.

Что бы я сделал:

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

  • либо используйте AJAX для опроса сервера для получения URL-адреса результата (возможно, для отображения строки состояния пользователя)
  • или отправьте URL клиенту по электронной почте
1 голос
/ 30 ноября 2010

Я не собираюсь предлагать, что вы можете сделать со своим бэкэндом JMS - он, вероятно, не используется должным образом, или, возможно, это так - я не уверен.

Мы реализовали нечто подобное, и вот чем мы закончилис (наша реализация бэкэнда была совершенно другой, для другого варианта использования, но «async user exp» соответствует):

  1. Разрешить пользователю отправлять запрос.
  2. Once (1) получено, отправьте задание на сервер (JMS и т. Д.) И привяжите его к идентификатору задания
  3. Ответ (1) - это дескриптор this (постоянный или временный) - идентификатор заданияНапример,
  4. Внутренняя реализация должна завершиться установкой статуса задания
  5. Разрешить пользователям опрашивать состояние задания (с помощью дескриптора, который вы им дали)
  6. Если статус задания «в процессе», сообщите им об этом (вероятно, с предполагаемым временем выполнения - чтобы они не тратили ненужное время на опрос и обременение вас)
  7. Если статус «выполнено успешно»,сообщить об этом пользователю, wИз других данных (URL и т. д.) пользователю потребуется получить доступ к результату
...