В последнее время мы наблюдаем сбои сервера Domino. Мы обнаружили, что сбои вызваны параллельными вызовами одной и той же Xpage одним и тем же пользователем.
Теперь мы связали вызовы Ajax с Xpage, чтобы они были синхронными, и сбои прекратились.
Поскольку мы хотели бы перейти к большему количеству обращений Ajax к Xpages (стиль Xagent) в будущем, нам хотелось бы знать, почему это происходит и как его решить. Мы не можем найти код в javacode, который должен быть синхронизирован.
Это известная проблема. Как мы можем обойти эту проблему без выполнения всех вызовов синхронно?
Сводка решения, которое вызывает ошибку:
Веб-страница вызывает Xpage, который вызывает XAgent через SSJS в afterRenderResponse. Javaclass читает сообщение Post Request и отправляет JSON обратно через FacesContext.
Подробное описание:
Мы вызываем Xpage с помощью вызовов Ajax POST. Иногда эти вызовы выполняются для одной и той же Xpage одним и тем же пользователем в параллель. (Это когда мы получаем сбои)
IE в javascript (Angular):
Код, который дает сбой серверу:
$http.post('xpage1.xsp',data1,config).then(){
Do stuff with response from call1
}
$$http.post('xpage1.xsp',data2,config).then(){
Do stuff with response from call2
}
Код, который работает:
$http.post('xpage1.xsp',data1,config).then(){
Do stuff with response from call1;
$$http.post('xpage1.xsp',data2,config).then(){
Do stuff with response from call2
}
}
где данные просто являются объектом, связывающим данные запроса, а config - это просто конфигурация для вызова HTTP.
Xpage вызывает javacode в событии AfterRenderResponse Xpage. ((Рамки XAgent)
Javacode использует объект FacesContext для чтения запроса и создания ответа.
Читает опубликованный JSON и получает документ. который создает объект Java. Мы создаем новый JSON из объекта JavaObject через GSON и отправляем этот JSON в ответ браузеру.
private static FacesContext faccon;
private static ExternalContext extcon;
private static HttpServletRequest request;
private static HttpServletResponse response;
private String logOn ="";
private boolean javaDebuggingOn = false;
public SaveCtrl() {
faccon = FacesContext.getCurrentInstance();
extcon = faccon.getExternalContext();
request = (HttpServletRequest) extcon.getRequest();
response = (HttpServletResponse) extcon.getResponse();
}
public void post() throws IOException {
String processName = className + "." + "post";
response.setHeader("Cache-Control", "no-cache");
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.setStatus(200); // HTTP OK
ResponseWriter writer = faccon.getResponseWriter();
//Handle JSON in POST Request
String requestBody = extractPostRequestBody(request);
String action = requestData.get("action");
//Send JSON response
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd HH:mm:ss")
.create();
List myList = getList(action);
String jsonOut= gson.toJson(myList );
writer.write(jsonOut);
writer.endDocument();
faccon.responseComplete();
}