运行并行Xagent调用时Domino崩溃

时间:2019-04-09 07:56:33

标签: xpages lotus-domino

最近我们一直在经历Domino服务器崩溃。我们发现崩溃是由同一用户对相同Xpage的并行调用引起的。

我们现在已经将Ajax调用链接到Xpage,以便它们是同步的,并且崩溃已停止。

随着我们希望在未来的开发中朝着Xpages(Xagent风格)的更多Ajax调用前进,我们想知道为什么会发生这种情况以及如何解决它。我们在javacode中找不到需要同步的任何代码。

是这个已知问题。如果不同步执行所有呼叫,如何解决这个问题?

引起错误的解决方案摘要:

一个网页调用一个Xpage,该页面在afterRenderResponse中通过SSJS调用XAgent。 Javaclass读取Post Request并通过FacesContext发送回JSON。

详细说明:

我们通过Ajax POST调用来调用Xpage。有时,这些调用是由同一用户并行地向同一Xpage执行的。 (即当我们崩溃时)

使用javascript的IE(角度):

使服务器崩溃的代码:

$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
        }
 }

数据只是其中包含requestdata的对象,而config只是HTTP调用的配置。

Xpage在Xpage的AfterRenderResponse事件中调用Java代码。 (((XAgent框架)

Java代码正在使用FacesContext对象读取请求并创建响应。 它读取发布的JSON并获取文档。它将创建一个Java对象。然后,我们通过GSON从JavaObject创建新的JSON,然后将此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();

     }

2 个答案:

答案 0 :(得分:1)

您是否在XPage上设置了viewState="nostate"?如果没有,则您要序列化和反序列化页面的组件树,并且它们将被共享。那可能会导致问题,我可以理解为什么会导致崩溃。如果仅将其用于REST访问,则没有理由存储组件树,因此请在应用程序的XSP属性中进行设置。默认情况下未启用它,因为典型的XPages应用程序应保留页面历史记录。但是,您并不是将其用作典型的XPages应用程序,而是用作简单的REST服务应用程序。

答案 1 :(得分:0)

答案是,当将响应更改为REST组件后,调用并行运行时,代码读写响应中会出现som错误。