Сбой Domino при выполнении вызовов Parallell Xagent - PullRequest
2 голосов
/ 09 апреля 2019

В последнее время мы наблюдаем сбои сервера 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();

     }

1 Ответ

1 голос
/ 09 апреля 2019

Вы устанавливаете viewState="nostate" на своем XPage? Если нет, вы сериализуете и десериализуете деревья компонентов для страницы, и они становятся общими. Это может вызвать проблемы, и я могу понять, почему это может вызвать сбои. Если вы используете его только для доступа к REST, нет причин хранить деревья компонентов, поэтому установите его в свойствах приложения XSP. Он не включен по умолчанию, потому что типичные приложения XPages должны хранить историю страниц. Но вы используете его не как обычное приложение XPages, а как простое приложение службы REST.

...