【发布时间】:2009-06-25 19:06:30
【问题描述】:
我有一个 struts2 操作,它通过获取一些请求参数、调用返回 XML 数据的远程服务、然后通过 XSL 转换数据并通过流结果返回结果 XHTML 来响应 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 操作,有时响应完全空白(不应该发生),有时响应在开始或结束时被一些随机切断数量,有时响应会被切换,因此 AJAX 请求者会收到错误的响应。
我知道这是一个线程安全问题,我已经将所有重要的变量定义移到了 execute() 方法中,因此它们不是实例变量(因此被所有人共享)。唯一有趣的实例变量是 inputStream,我将其视为问题的原因。
有没有办法让 inputStream 变量成为线程安全的?还是有其他我没有看到的解决方案?
【问题讨论】:
标签: java multithreading tomcat struts2