いくつかのリクエストパラメータを受け取り、XMLデータを返すリモートサービスを呼び出し、XSL経由でデータを変換して結果を返すことによって、AJAXリクエストに応答するstruts2アクションを取得しましたストリーム結果を介した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によって制約されています。インスタンス変数を使用せずに直接出力する方法を見つけることができたら、それを行います。 –
これを行う方法が見つかりましたが、直接問題が解決したようです。 –