【问题标题】:Copy a session for a thread复制线程的会话
【发布时间】:2014-09-28 17:32:27
【问题描述】:

我需要有两个具有相同数据的会话。我怎样才能做到这一点?

我的场景:用户在遍历站点时在会话中积累了一些数据。他们点击一个按钮,现在我启动一个线程来记录我所拥有的。不幸的是,我继承的代码传递了会话 ID 并使用它来访问数据。更不幸的是,此记录需要一些时间,因此用户经常点击其他页面并弄乱我正在记录的数据。

  • 用户需要一个可以继续玩的会话
  • 我的线程需要一个不会改变的会话

理想情况下,我可以将会话数据复制到两个会话中,每个会话一个。 我真的很想要一个能够以某种方式为我提供这两个会话的解决方案,因为重构代码将是一场噩梦。我意识到这似乎几乎是不可能的。我能想到的最接近的方法是复制数据,使会话无效,为用户重新创建它,然后将无效的会话 ID 传递给线程并希望它没有被清除——这不是我信任的计划。

如果没有其他办法,提出替代方案。优先考虑重构的速度;否则,整体优雅。

关于实现的更多信息:线程会触发许多请求,包括会话 ID,每个请求都会根据会话中收集的数据生成一个 PDF,该数据由线程合并到主文档中。

【问题讨论】:

  • 如果会话中的对象是可变的并且可能被后续用户操作修改,则会话的浅拷贝可能不够。您不能只收集足以让后台任务完成其工作的最少信息集吗?
  • 这个线程中的进程需要一个实际的会话而不是包含会话中某些元素的数据结构是没有意义的。
  • 你们如何解决使用会话 ID 的请求?

标签: java multithreading jsp session


【解决方案1】:

在您的情况下,我会在会话中存储一些数据对象。当您需要启动一个线程来处理这些数据时,您可以克隆数据对象,而不是会话本身。当然,您必须编写一些代码来对此数据对象执行深层复制,但至少您的会话将只是一个包装器(就像会话通常那样)。

创建一个数据对象来存储你的线程需要的所有数据在某种程度上建立了某种“契约”,所以如果任何其他开发人员需要从这个数据对象中添加或删除任何东西,他/她会注意到深层副本方法也必须更新(希望如此)。

【讨论】:

  • 线程触发的请求怎么样?那些也需要访问数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 2018-10-24
  • 2011-02-12
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多