我有一个struts2动作,它通过接收一些请求参数来响应AJAX请求,调用返回XML数据的远程服务,然后通过XSL转换数据并返回结果XHTML通过流结果。响应根据给定的参数而不同。通过struts2动作处理多个同时发生的AJAX请求
这是一个带一堆东西的动作类取出:
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>
我的问题是,当我有多个请求同时都会调用ServiceHandler动作,有时候响应是完全空白的(不应该发生),有时响应会在开始或结束时被一些随机量切断,有时响应会被切换,所以一个A收到错误的答复JAX请求者。我知道这是一个线程安全问题,我已经将所有重要的变量定义移动到execute()方法中,以使它们不是实例变量(因此被所有变量共享)。唯一有趣的变量是一个实例变量,它是inputStream,我把它看作是我的问题的原因。
有没有办法使inputStream变量线程安全?还是有另一种解决方案,我没有看到?
我不需要返回“成功”,而只是受到struts2的限制,只要我可以或不可以做。如果我可以找到一种方法直接输出而不必使用实例变量,那么我会这样做。 – 2009-06-25 20:50:17