Java Grails一次调用一个方法

Java Grails一次调用一个方法,java,ajax,spring,grails,groovy,Java,Ajax,Spring,Grails,Groovy,我想违背控制器的方法一次处理多个请求。 有什么好的方法来实现这一点吗 当我通过ajax post/get请求调用方法时出现问题。 我为ajax声明了超时。通过超时,js重新发送ajax请求。有时服务器在给定的超时时间没有准备好响应。所以在处理一个ajax请求的过程中,服务器开始处理另一个ajax请求,我遇到了麻烦 我知道我可以通过$.when().done()或ajax成功函数在客户端修复它,但我不知道如何在服务器端修复它。有什么想法吗 如果需要确保特定代码块一次只执行一次(无论是控制器操作还是

我想违背控制器的方法一次处理多个请求。 有什么好的方法来实现这一点吗

当我通过ajax post/get请求调用方法时出现问题。 我为ajax声明了超时。通过超时,js重新发送ajax请求。有时服务器在给定的超时时间没有准备好响应。所以在处理一个ajax请求的过程中,服务器开始处理另一个ajax请求,我遇到了麻烦


我知道我可以通过$.when().done()或ajax成功函数在客户端修复它,但我不知道如何在服务器端修复它。有什么想法吗

如果需要确保特定代码块一次只执行一次(无论是控制器操作还是其他操作),可以使用java的
synchronized
关键字。您可以通过将其添加到方法签名中来添加方法级同步,尽管我不知道这对控制器操作的效果如何(我从未尝试过)。还可以通过将代码包装为以下内容来添加同步块:

// inside your controller action
synchronized {
    // will only execute once concurrently within your JVM
}
或者,您可以在某些对象上进行同步,以便同步可以基于某些参数:

// inside your controller action
synchronized ("${params.something}-whatever".intern()) {
    // will only execute one concurrently per unique 'key'
}
有一些细微差别值得学习(例如,如果您从内部调用此方法,会发生什么:它将起作用,以及插入字符串与使用其他一些关键对象进行同步的内存影响),但这是一种通用模式,应该允许您控制潜在线程不安全代码的并发执行

尽管如此,还是要小心实现这样的模式。当底层问题通常出现在客户端代码中,并且需要更好地处理重复或中止的请求时,很容易导致性能低下甚至死锁

有关字符串实习的讨论(旧但仍然有用),请参阅。有关java中同步的信息,请参阅和。