运行 并行代理调用时 Domino 崩溃
Domino Crashes when running parallell Xagent calls
我们最近遇到了 Domino 服务器崩溃的问题。我们发现崩溃是由同一用户对同一 Xpage 的并行调用引起的。
我们现在已将 Ajax 调用链接到 Xpage,以便它们同步并且崩溃已停止。
因为我们希望在未来的开发中更多地 Ajax 调用 Xpages(Xagent 样式),所以我们想知道为什么会发生这种情况以及如何解决它。我们在javacode中找不到任何需要同步的代码。
这是已知问题。我们如何在不同步执行所有调用的情况下解决这个问题?
导致错误的解决方案总结:
网页在afterRenderResponse调用Xpage,Xpage通过SSJS调用XAgent。 Javaclass 读取 Post 请求并通过 FacesContext 发回 JSON。
详细说明:
我们通过 Ajax POST 调用来调用 Xpage。有时,这些调用是由同一个用户并行地对同一个 Xpage 执行的。 (那是我们崩溃的时候)
javascript 中的 IE (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 的 AfterRenderResponse 事件中的 javacode。 ((XAgent 框架)
Java代码使用 FacesContext 对象读取请求并创建响应。
它读取 JSON 发布并获取文档。它创建了一个 Java 对象。然后我们通过 GSON 从 Java 对象创建新的 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 属性中设置它。默认情况下未启用它,因为典型的 XPages 应用程序应该保留页面历史记录。但是您没有将它用作典型的 XPages 应用程序,而是用作简单的 REST 服务应用程序。
答案是当这被更改为调用并行运行的 REST 组件时,代码读取和写入响应中存在一些错误。
我们最近遇到了 Domino 服务器崩溃的问题。我们发现崩溃是由同一用户对同一 Xpage 的并行调用引起的。
我们现在已将 Ajax 调用链接到 Xpage,以便它们同步并且崩溃已停止。
因为我们希望在未来的开发中更多地 Ajax 调用 Xpages(Xagent 样式),所以我们想知道为什么会发生这种情况以及如何解决它。我们在javacode中找不到任何需要同步的代码。
这是已知问题。我们如何在不同步执行所有调用的情况下解决这个问题?
导致错误的解决方案总结:
网页在afterRenderResponse调用Xpage,Xpage通过SSJS调用XAgent。 Javaclass 读取 Post 请求并通过 FacesContext 发回 JSON。
详细说明:
我们通过 Ajax POST 调用来调用 Xpage。有时,这些调用是由同一个用户并行地对同一个 Xpage 执行的。 (那是我们崩溃的时候)
javascript 中的 IE (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 的 AfterRenderResponse 事件中的 javacode。 ((XAgent 框架)
Java代码使用 FacesContext 对象读取请求并创建响应。 它读取 JSON 发布并获取文档。它创建了一个 Java 对象。然后我们通过 GSON 从 Java 对象创建新的 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 属性中设置它。默认情况下未启用它,因为典型的 XPages 应用程序应该保留页面历史记录。但是您没有将它用作典型的 XPages 应用程序,而是用作简单的 REST 服务应用程序。
答案是当这被更改为调用并行运行的 REST 组件时,代码读取和写入响应中存在一些错误。