场景:在Tomcat服务器上运行的基于Apache Wicket的Web应用程序。
用户在浏览器中打开URL,创建会话并在浏览器中显示简单主页,用户单击按钮并调用 AJAX调用。应用程序获取请求并做一些准备响应的东西。同时浏览器中的用户或JavaScript调用另一个AJAX调用 - 第二个请求在应用程序的另一个线程中处理,并且因为应用程序的大多数部分是特定于会话的并且不是线程安全的(因为一个用户=一个会话),异常抛出。
可能的解决方案:
使所有应用程序类都是线程安全的(非常昂贵)
适应GUI,因此不能在一个会话中同时运行两个AJAX调用(不可能是浏览器GUI的本质)
在Wicket或Tomcat级别的一个会话中同步所有请求(但是如何?)
另一种做法或技巧???
由于
答案 0 :(得分:4)
对同一PageMap中的页面或组件的请求 单个会话已经是同步的 - 一次只有一个线程。请求资源,如 图像,javascript,css文件等是异步处理的。 (不同的客户 永远不要互相阻止,因为每个客户都有自己的Session和PageMap)。
但是,我认为,对会话中的项目的访问并未明确同步。
顺便提一下,从不是请求线程的线程访问Session / Pages不是一个好主意,因为容器可以在请求之间对会话/页面做任何事情 - 例如把它写到磁盘等。
答案 1 :(得分: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.
*/