2012-10-11 148 views
4

寻求使用Struts2和Serlvet 3.0异步支持。struts2异步操作

我的第一种方法是在操作中写入输出流并返回null。然而这返回404“资源不可用”。我试图在一个struts动作中使用一个Bosh servlet,使用ServletRequestAware,ServletResponseAware接口来注入响应。

我正在使用struts过滤器调度程序。不能完全确定这是否可行,但如果其他人设法在struts操作中使异步工作,那么肯定会很开心。也许这是一个AsyncResult类型或其他一些魔术来使这个工作。

+0

检查此[链接] [1]。它可以帮助你 [1]:http://stackoverflow.com/questions/11026542/get-json-data-from-struts/13527598#13527598 –

回答

4

确保struts过滤器允许异步。下面是在web.xml文件中的样子:

<filter> 
    <filter-name>struts2</filter-name> 
    <filter-class> 
     org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 
    </filter-class> 
    <async-supported>true</async-supported> 
</filter> 

然后从内行动取得HttpServletRequestHttpServletResponse和使用AsyncContext你将一个servlet中:

public String execute() { 
    HttpServletRequest req = ServletActionContext.getRequest(); 
    HttpServletResponse res = ServletActionContext.getResponse(); 

    final AsyncContext asyncContext = req.startAsync(req, res); 
    asyncContext.start(new Runnable() { 
    @Override 
    public void run() { 
     try { 
     // doing some work asynchronously ... 
     } 
     finally { 
     asyncContext.complete(); 
     } 
    } 
    }); 

    return Action.SUCCESS; 
} 
+0

你试过吗?我使用JMeter进行了测试,性能没有任何改进,并且像同步操作一样。这似乎不起作用:( –

+0

是的。在我的使用案例中,动作是发送一封电子邮件给潜在的许多目的地,并且我不希望在所有电子邮件发送之前阻止响应呈现。使用“AsyncContext”允许动作立即返回给用户,同时继续发送电子邮件 –

+0

也许你使用了'ExecAndWait拦截器'!正如我研究的那样,'AsyncContext'不会立即返回给用户,而是将当前线程返回给池并在另一个线程中运行异步代码。当完成时,它从池中获得另一个线程来发送响应给用户,即在用户的观点中它是同步的而不是异步的,我刚刚用JMeter测试了你的上面的代码和一个'Thread.sleep';我不能看看usres,线程和连接超出最大值的结果有什么不同 –