Java Wicket:如何在会话中同步请求

Java Wicket:如何在会话中同步请求,java,javascript,ajax,thread-safety,wicket,Java,Javascript,Ajax,Thread Safety,Wicket,场景:在Tomcat服务器上运行的基于ApacheWicket的web应用程序 用户在浏览器中打开URL,创建会话并在浏览器中显示简单主页面,用户单击按钮并调用AJAX调用。应用程序获取请求并做一些准备响应的工作。同时,浏览器中的用户或JavaScript调用另一个AJAX调用——这第二个请求在应用程序中的另一个线程中处理,并且由于应用程序的大多数部分是特定于会话的,并且不是线程安全的(因为一个用户=一个会话),异常抛出 可能的解决办法: 使所有应用程序类线程安全(非常昂贵) 调整GUI,以便n

场景:在Tomcat服务器上运行的基于ApacheWicket的web应用程序

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

可能的解决办法:

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

  • 调整GUI,以便no在一个会话中同时运行两个AJAX调用(由于浏览器GUI的性质,不可能)

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

  • 另一种做法或技巧


  • 谢谢

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

    我没有理由过多地使用它们,但我知道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.
     */
    

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

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


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

    我认为特定的异常与此无关,事实上它是ConcurrentModificationException。更重要的是,设计上不安全的代码是从两个线程同时调用的。我想最好在Wicket级别阻止它。我不想更改所有应用程序逻辑。您正在修改相同的数据吗?我知道,在我们的应用程序中,我们已经尽了很大的努力来利用Wicket的模型对象,而不是把东西放在会话中。我们在会话中有一些东西,但不是很多。最后:它是来自处理请求的线程和在另一个先前处理的请求中触发的另一个线程的并发访问。Wicket(我相信)确实可以同步来自同一页面的请求。谢谢。正如您所提到的,最后是来自处理请求的线程和在另一个先前处理的请求中触发的另一个线程的并发访问。Wicket(我相信)确实可以同步来自同一页面的请求。非常感谢。