2

场景:在 Tomcat 服务器上运行的基于 Apache Wicket 的 Web 应用程序。

用户在浏览器中打开 URL,创建会话并在浏览器中显示简单的主页,用户单击按钮并调用 AJAX 调用。应用程序获取请求并做一些准备响应的事情。同时,浏览器中的用户或 JavaScript 调用另一个 AJAX 调用——第二个请求在应用程序的另一个线程中处理,并且因为应用程序的大多数部分是特定于会话的并且不是线程安全的(因为一个用户 = 一个会话),抛出异常

可能的解决方案:

  1. 使所有应用程序类线程安全(非常昂贵)

  2. 调整 GUI,因此不会在一个会话中同时运行两个 AJAX 调用(由于浏览器 GUI 的性质,不可能)

  3. 在 Wicket 或 Tomcat 级别同步一个会话中的所有请求(但如何?)

  4. 另一种做法或技术???

谢谢

4

2 回答 2

4

在单个 Session 中对同一 PageMap 中的页面或组件的请求已经是同步的 - 一次只有一个线程。对图像、javascript、css 文件等资源的请求是异步处理的。(不同的客户端永远不会互相阻塞,因为每个客户端都有自己的 Session 和 PageMap)。

但是,我相信,对 Session 本身的项目的访问并没有明确同步。

顺便说一句,从不是请求线程的线程访问会话/页面不是一个好主意,因为容器可以在请求之间自由地对您的会话/页面做任何事情 - 例如将其写入磁盘等。

于 2009-12-03T17:13:32.210 回答
3

抛出的异常是什么?如果抛出异常,那么我会假设 Session 对象的关键部分需要同步或更加小心地处理,可能不是整个会话。

我没有理由过多地使用它们,但我知道 wicket-ajax.js(在 org.apache.wicket.ajax 包中找到)中有频道。这些控制如何处理多个 AJAX 调用。他们可能值得一看。在这个文件中有以下注释:

/**
 * Channel management
 *
 * Wicket Ajax requests are organized in channels. A channel maintain the order of 
 * requests and determines, what should happen when a request is fired while another 
 * one is being processed. The default behavior (stack) puts the all subsequent requests 
 * in a queue, while the drop behavior limits queue size to one, so only the most
 * recent of subsequent requests is executed.
 * The name of channel determines the policy. E.g. channel with name foochannel|s is 
 * a stack channel, while barchannel|d is a drop channel.
 *
 * The Channel class is supposed to be used through the ChannelManager.
 */
于 2009-12-03T14:48:42.997 回答