Java 使用struts2操作处理多个并发AJAX请求
我有一个struts2操作,它通过获取一些请求参数来响应AJAX请求,调用一个返回XML数据的远程服务,然后通过XSL转换数据,并通过流结果返回结果XHTML。根据给定的参数,响应不同 这是一堂动作课,里面有很多东西:Java 使用struts2操作处理多个并发AJAX请求,java,multithreading,tomcat,struts2,Java,Multithreading,Tomcat,Struts2,我有一个struts2操作,它通过获取一些请求参数来响应AJAX请求,调用一个返回XML数据的远程服务,然后通过XSL转换数据,并通过流结果返回结果XHTML。根据给定的参数,响应不同 这是一堂动作课,里面有很多东西: public class ServiceHandler extends ActionSupport { private ByteArrayInputStream inputStream; public String execute(){ Str
public class ServiceHandler extends ActionSupport {
private ByteArrayInputStream inputStream;
public String execute(){
String response = "";
// Get request parameters
// Make a request to a remote server via an http connection
// Transform result via XSL
//uses dom4j for XML/XSL stuff
//this should never be empty
response = resultDoc.asXML();
inputStream = new ByteArrayInputStream(response.getBytes());
return "success";
}
public ByteArrayInputStream getInputStream(){
return inputStream;
}
}
下面是重要的struts.xml信息:
<action name="sh" class="ServiceHandler">
<result name="success" type="stream">
<param name="contentType">text/html</param>
<param name="contentDisposition">inline;filename="response.html"</param>
<param name="bufferSize">1024</param>
<param name="allowCaching">false</param>
</result>
</action>
文本/html
内联;filename=“response.html”
1024
假的
我的问题是,当我有多个请求同时进行时,所有请求都调用ServiceHandler操作,有时响应完全为空(不应该发生),有时响应在开始或结束时被一些随机量切断,有时响应被切换,这样,AJAX请求者就会收到错误的响应
我知道这是一个线程安全问题,我已经将所有重要的变量定义移到execute()方法中,以便它们不是实例变量(因此所有人都共享)。作为实例变量的唯一有趣的变量是inputStream,我将其视为问题的原因
有没有办法使inputStream变量线程安全?还是有其他解决方案我没有看到?我只熟悉Struts 1,但看看DonwloadAction。或者只使用一个简单的struts操作,将结果直接写入响应对象,并将null作为forward返回。我根本不喜欢struts 2,但是如果您真的必须返回“success”结果,并且无法直接写入输出,那么这看起来是一个很好的地方,可以使用a将流保持在当前线程的本地。(有关该模式的更多信息,请参见在线本地存储。)感谢Henning为我指引了正确的方向。我没有想过直接写入响应输出流,因为struts2文档中没有提到它 将响应直接写入输出流的好处是不需要为inputStream创建实例对象。这会将所有数据保留在execute()方法中,这对其他线程是安全的 这里是一个修改过的action类,它直接写入输出流并返回空结果
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
public class ServiceHandler extends ActionSupport {
public String execute(){
String response = "";
// Get request parameters
// Make a request to a remote server via an http connection
// Transform result via XSL
//uses dom4j for XML/XSL stuff
//this should never be empty
response = resultDoc.asXML();
HttpServletResponse httpResponse = ServletActionContext.getResponse();
try{
httpResponse.getOutputStream().print(response);
}
catch(IOException e){
return "failure";
}
return null;
}
}
这似乎已经解决了我遇到的问题。我不需要返回“成功”,我只受struts2的约束,尽可能做到我能做到的和不能做到的。如果我能找到一种直接输出的方法,而不必使用实例变量,那么我会这样做。找到了一种方法,直接编写似乎解决了我的问题。