【问题标题】:Grails one method call at a timeGrails 一次调用一个方法
【发布时间】:2018-12-11 11:22:40
【问题描述】:

我想一次不服从控制器的方法处理多个请求。 有什么好的方法来实现吗?

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

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

【问题讨论】:

    标签: java ajax spring grails groovy


    【解决方案1】:

    如果您需要确保特定代码块一次只执行一次(无论是控制器操作还是其他),您可以使用 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'
    }
    

    有一些细微差别值得学习(例如,如果您从自身内部调用此方法会发生什么:它会起作用,以及实习字符串与使用其他一些关键对象进行同步的内存影响)但这是一个通用模式,应该允许您控制潜在线程不安全代码的并发执行。

    说了这么多,在实现这样的模式时要小心。很容易导致性能不佳甚至死锁,而根本问题通常出在客户端代码中,并且需要更好地处理重复或中止的请求!

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-04
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 2012-11-08
    • 2019-09-24
    • 2010-09-28
    相关资源
    最近更新 更多