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

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

可能的解决方案:

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

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

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

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

谢谢

有帮助吗?

解决方案

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

但是,我认为,对会话本身中的项目的访问并未显式同步。

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

其他提示

抛出的异常是什么?如果抛出异常,那么我会假设 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.
 */
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top