2014-08-05 3 views
0

Мне нужно иметь две сессии с теми же данными. Как я могу это сделать?Скопировать сеанс для потока

Мой сценарий: пользователь собрал некоторые данные в сеансе во время прохождения сайта. Они нажимают кнопку, и теперь я запускаю поток, чтобы записать то, что у меня есть. К сожалению, код, который я унаследовал, передает идентификатор сеанса и использует его для доступа к данным. К сожалению, эта запись занимает некоторое время, поэтому пользователи часто попадают на другие страницы и испортили данные, которые я записываю.

  • Потребитель сеанс, что они могут продолжать играть с
  • My нитью нужен сеанс, который не собирается менять

В идеале я бы иметь возможность копировать данные сеанса в два сеансы, по одному для каждого. Мне действительно понравилось бы решение, которое каким-то образом дает мне эти две сессии, потому что рефакторинг кода будет кошмаром. Я понимаю, это кажется почти невозможным. Самое близкое, что я могу понять, это скопировать данные, аннулировать сеанс, заново создать его для пользователя, а затем передать недопустимый идентификатор сеанса в поток и надеяться, что он не был очищен — не план, которому я доверяю.

Если нет другого способа, , пожалуйста, предложите альтернативы. Приоритет - скорость рефакторинга; в противном случае, всего элегантность.

Подробнее об осуществлении: поток запускает несколько запросов, включая идентификатор сеанса, каждый из которых генерирует PDF, основываясь на данных, собранных в сеансе, которые объединены потоком в главный документ.

+0

Неверная копия сеанса может быть недостаточной, если объекты в сеансе являются изменяемыми и могут быть изменены путем последующих действий пользователя. Не можете ли вы просто собрать минимальный набор информации, достаточный для завершения фоновой задачи? – isnot2bad

+0

Не имеет смысла, что для процесса в этом потоке потребуется фактическая сессия, а не структура данных с определенными элементами из сеанса. – developerwjk

+0

Как вы, ребята, работаете с запросами, используя идентификатор сеанса? – ricksmt

ответ

1

В вашей обуви я бы сохранил некоторый объект данных в сеансе. Когда вам нужно запустить поток для обработки этих данных, вы можете клонировать объект данных, а не сам сеанс. Конечно, вам придется написать код для выполнения глубокой копии на этом объекте данных, но по крайней мере ваш сеанс будет всего лишь оберткой (как правило, это сеансы).

И создание объекта данных для хранения всех данных, которые требуется вашему потоку, несколько устанавливает какой-то «контракт», поэтому, если любой другой разработчик должен добавить или удалить что-либо из этого объекта данных, он/она заметит, что глубокий метод копирования также должен быть обновлен (надеюсь).

+0

Как насчет запросов, которые запускает поток? Им также необходим доступ к данным. – ricksmt

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