У меня есть действие struts2, которое отвечает на запрос AJAX, принимая некоторые параметры запроса, вызывая удаленную службу, которая возвращает данные XML, затем преобразовывая данные через XSL и возвращая полученный XHTML через Stream Result. Ответ зависит от заданных параметров.
Вот класс действий с кучей вещей, взятых:
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 потоко-безопасной? Или я не вижу другого решения?