繁体   English   中英

Spring MVC和Ajax请求在同一个控制器中

[英]Spring MVC and Ajax requests in the same controller

我在Spring 3.0.5中设置了以下控制器。 带有Windows 7主机的Tomcat Webserver 7.0.14。

    @Controller
    @RequestMapping (value="myForm")
    public class SubmitClassController {


    //Status object with getters and setters
    Status myStatus= newStatus();

   @RequestMapping (method=RequestMethod.GET)
    public String getMyForm (Model getModel){
    //setup form
   //very simple adds one attribute to the model and returns view
    }

    @RequestMapping (value="/myFormStatus",method=RequestMethod.POST)
    public @ResponseBody Status getStatus(){
    //Ajax responder handles a null (empty) request and responds with results of status obj
    //Has System.out.println prior to return that shows variables when processed correctly
    System.out.printlin ("vars are: "+myStatus.getStatus()+" "+myStatus.getCurStep()+" "+myStatus.getTotSteps());
     return myStatus;
     }

    @RequestMapping (method=RequestMethod.POST)
    public String create (@Valid MyFormText submitText ...){
   // processes the form submitted and sets status object variables while doing so .
   //many steps each one is bascily query a remote DB wait for response, add response to the set  repeat. After each query myStatus has its status,curStap and totstep set.
   }


  }

我从firefox或IE执行如下的ajax请求,结果是一样的

   Ext.Ajax.request({
    url: './myForm/myFormStatus',
    method: 'POST',
    success: function(result, request) {
        var json = Ext.decode(result.responseText);
        pbar.updateProgress(json.step / json.steps, 'Working on ' + json.status + ' Step ' + json.step + ' of ' + json.steps + '...');

    },
    failure: function(result, request) {
        Ext.MessageBox.alert('Failed runner', result.responseText);
    }

});

除了在“创建”POST方法期间调用时,Ajax响应器才能正常工作。 所以我在循环中运行ajax查询,而create方法(处理POST)没有运行它返回正常。 但是,当create正在运行时,Ajax响应是间歇性的,并且Ajax请求通常不会响应。 服务器没有锁定和冻结而只是在create方法实际执行某些操作时停止响应状态方法。

我尝试用填充数组的循环替换大量的创建。 我得到了更多的ajax响应,但没有一个接近一个,最多得到20个响应中的100个。我还测试了更改状态对象的值以确认值将返回有效的JSON。 他们都工作了。 在我刚刚填充树形图和数组的测试运行时,我还看了Jconsole和任务管理器以查看资源约束的迹象。 HTe JVM从未使用过50%以上的可用内存,而且其他I / O,RAM或CPU都是接近加载的。

显然这里有些不对劲。 我尝试将@Async注释附加到Ajax控制器和POST处理程序,但这似乎没有做任何更改。 我还尝试在请求中设置超时和自动中止。

在100个Ajax请求中,我得到一个响应......其余的似乎被阻止了。 在调用创建块之前或之后,响应是即时的。 我不应该重载浏览器。 有问题的ajax请求设置为每四分之一秒触发一次(进度条更新程序)。 即使我将ajax请求限制为每秒1次(甚至每2秒1次),结果也是一样的。 ajax调用是按时完成的,所以JS方面按预期工作。

我使用wireshark所以我可以看到ajax请求进来。我可以考虑大多数ajax请求,因为我可以看到它们到达服务器。 我可以看到它们命中处理程序,但只有当“create”方法不“忙”时才会出现故障排除(System.out.println)消息。 要清楚“忙”意味着处理它所做查询的结果,“不忙”似乎意味着等待响应。没有使用锁存器或信号量。 添加Spring @Async注释没有任何区别。

有谁知道这里发生了什么? 它似乎被锁定并阻止响应? 控制器是否锁定到单个线程?

请记住浏览器每个域只有2-4个线程(取决于浏览器),因此一次不会超过2-4个请求,因此您的Web服务器必须及时发送这些响应,以使它们不会超时。 如果你在大约10毫秒内没有得到这些请求,那么一次发送100个请求可能会被丢弃。

当您发出100个请求时,您是否在create方法中看到了所有这100个请求? 您是否在启动时记录了一些数据并在完成时记录了所有数据? 我确保您从服务器中的浏览器获取所有100个请求,并为每100个请求生成响应。 使用log4j,您可以看到为每个请求提供服务的线程名称。 这些线程名称将帮助您识别每个单独的请求,以便您可以匹配在开始和结束时记录的消息。 System.out你没有开箱即用。

如需更多测试,请试试这个 如果您每个浏览器只发送10个请求,会发生什么? 你得到了所有这些吗? 如果是这样,那么乘以2,看看你是否得到所有这些,等等,直到你开始看到它们下降。

我希望您只是通过尝试每个浏览器会话发送100个请求来测试性能,否则当您转到生产时会破坏您的服务器,并且30,000个浏览器x 100 = 3百万个请求命中该页面。 如果你不只是测试东西,我会认真考虑重新设计你正在做的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM