我有一個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