我们最近遇到过Domino服务器崩溃。我们发现崩溃是由同一用户对同一Xpage的并行调用引起的。
我们现在将Ajax调用链接到Xpage,以便它们是同步的并且崩溃已经停止。
由于我们希望在未来的开发过程中向Xpages(Xagent风格)发出更多Ajax调用,我们想知道为什么会发生这种情况以及如何解决它。我们在javacode中找不到需要同步的代码。
这是已知问题吗?如何在不同步执行所有调用的情况下解决此问题?
导致错误的解决方案摘要:
一个网页调用一个Xpage,它通过afterRenderResponse中的SSJS调用XAgent。 Javaclass读取Post Request并通过FacesContext发回JSON。
详细说明:
我们通过Ajax POST调用调用Xpage。有时这些调用由并行的同一用户对同一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
}
}
数据只是一个包含请求数据的对象,而配置只是HTTP调用的配置。
Xpage在Xpage的AfterRender Response事件中调用java代码。 ((XAgent框架)
Javacode使用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();
}
你在XPage上设置viewState="nostate"
吗?如果没有,您将为页面序列化和反序列化组件树并将它们共享。这可能会导致问题,我可以理解为什么它可能会导致崩溃。如果您仅将其用于REST访问,则没有理由存储组件树,因此请在应用程序的XSP属性中进行设置。默认情况下不启用它,因为典型的XPage应用程序应该保留页面历史记录。但是您并没有将它用作典型的XPage应用程序,而是将其用作简单的REST服务应用程序。