Java 使用struts2操作处理多个并发AJAX请求

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

我有一个struts2操作,它通过获取一些请求参数来响应AJAX请求,调用一个返回XML数据的远程服务,然后通过XSL转换数据,并通过流结果返回结果XHTML。根据给定的参数,响应不同

这是一堂动作课,里面有很多东西:

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的约束,尽可能做到我能做到的和不能做到的。如果我能找到一种直接输出的方法,而不必使用实例变量,那么我会这样做。找到了一种方法,直接编写似乎解决了我的问题。