У меня есть действие 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>
Моя проблема заключается в том, что когда у меня одновременно выполняется несколько запросов, все из которых вызывают действие ServiceHandler, иногда ответ полностью пуст (никогда не должен происходить), иногда ответ обрезается в начале или в конце на некоторую случайную величину, и иногда ответы переключаются, так что запросчик AJAX получает неправильный ответ.
Я знаю, что это проблема безопасности потоков, и я переместил все важные определения переменных в метод execute(), чтобы они не были переменными экземпляра (и, следовательно, общими для всех). Единственная интересная переменная, которая является переменной экземпляра, — это inputStream, и я рассматриваю это как причину своих проблем.
Есть ли способ сделать переменную inputStream потокобезопасной? Или есть другое решение, которого я не вижу?