Java 在一系列小时间范围内处理来自同一客户机的多个请求

Java 在一系列小时间范围内处理来自同一客户机的多个请求,java,javascript,ajax,jakarta-ee,request,Java,Javascript,Ajax,Jakarta Ee,Request,我开发了一个web应用程序,其中包含一个仪表板,可以根据用户选择显示各种报告和图表 为用户提供了复选框和单选按钮,用于根据需要对报告进行操作。在选择每个复选框和单选按钮时,我将进行一个ajax调用,以显示与选择相对应的报告 我面临的问题是,当用户以很小的时间间隔(几分之一秒或一秒)一个接一个地单击多个复选框/单选按钮时,请求会以一系列的方式发送到服务器,服务器会以相同的顺序响应它们 例如,如果我有两个单选按钮,一个用于饼图,另一个用于折线图,并且用户在一系列小的时间间隔内同时单击这两个按钮,则服

我开发了一个web应用程序,其中包含一个仪表板,可以根据用户选择显示各种报告和图表

为用户提供了复选框和单选按钮,用于根据需要对报告进行操作。在选择每个复选框和单选按钮时,我将进行一个ajax调用,以显示与选择相对应的报告

我面临的问题是,当用户以很小的时间间隔(几分之一秒或一秒)一个接一个地单击多个复选框/单选按钮时,请求会以一系列的方式发送到服务器,服务器会以相同的顺序响应它们

例如,如果我有两个单选按钮,一个用于饼图,另一个用于折线图,并且用户在一系列小的时间间隔内同时单击这两个按钮,则服务器将首先显示饼图,并且在几毫秒内它将被折线图覆盖

是否有一种机制可以让我覆盖最新的 请求超过所有先前的请求

注意事项:

  • 我不想连续点击服务器,同时,我不想提供提交按钮(根据客户要求)
  • 如果我能找到一种javascript/ajax机制,只允许我向服务器提交最新的请求,那就太好了
  • 我正在使用Java/J2EE Struts2框架、javascript和ajax

  • 定义一个间隔,基本上是一个较长的自制
    事件循环
    ,以批处理或仅发送最新请求:

    var timeoutID
    
    function formChangeHandler() {
    
      clearTimeout(timeoutID)
    
      timeoutID = setTimeout(function() { 
        // send data to server
      }, 1000);
    
    }
    

    这只是许多可能的方法中的一种,在这种情况下,服务器只会在1000毫秒没有活动的情况下接收数据。

    嗯,我认为有两种不同的方法来处理这个问题

    正如其他用户所说,第一种可能是使用一点延迟

    • 优点:不会发送第一个请求(节省服务器负载)
    • 缺点:请求总是延迟的,因此用户必须等待,尽管他提出了一个单独的请求
    第二种可能是在另一个请求到来时中止第一个请求

    • 优点:请求可以实时处理
    • 缺点:请求总是发送到服务器
    我在这里留下一段代码片段,它应该适用于第二个选项。可能你需要做一些改变,我还没有证明这一点,但这是主要的想法:

    var xhr = null; // handles the current request
    
    function sendRequest(){
    
        if(xhr && xhr.readyState != 4){
            // When a request is made and another is ongoing, abort the previous
            xhr.abort(); 
        }
    
        xhr = $.ajax({
            .
            .
            . // Request parameters   
            done: function(data){
                // do something
            }
        });
    }
    

    所以,如果我在您的示例中理解得很好,正确的行为应该是只显示折线图?为什么不在向服务器发送请求之前添加延迟?也就是说,用户点击单选按钮->js客户端正在排队等待事件->用户点击其他按钮->js客户端重写最后一个事件->用户1秒不做任何事情->js客户端发送最后一个请求。@A-Tomy-k:是的,因为最新的请求是线条图,所以正确的行为应该是显示线条图。@PBSpecchnyi:我相信,延迟只会减慢这个过程。例如,如果用户在一秒钟后做出更改,它仍然会执行这两个请求。1秒只是一个重复出现的常见间隔。@VirajPai,是的,这不会阻止所有不必要的请求,但这会减少需要服务的请求量。此外,这将阻止您的客户端在每个用户单击时重新绘制ui。这似乎是我需要的,但因为我使用的是
    dojo.event.topic.publish(“showtprogressReport”)我没有得到任何返回类型。所以我只是想知道,是必须使用jquery ajax还是可以继续使用Struts2 ajax?我不知道我是否做得对。但我刚刚试过:
    var xhr=null;函数submitForm()showtprogressReport“;}}};}
    请建议,因为它似乎只是第一次发布。我从未使用过Dojo,因此我无法真正帮助它。正如您所说,Dojo.publish似乎没有返回任何内容。您的代码是错误的,因为您不需要使用JQuery($.ajax)来进行ajax调用(发布会自动完成)。检查此页面,您可能会发现一些有用的内容。connect.subscribe返回一个处理程序。执行connect.unsubscribe(处理程序)可能有效