【发布时间】:2019-10-07 20:59:47
【问题描述】:
我们最近一直在经历 Domino 服务器崩溃。我们发现崩溃是由同一用户并行调用同一 Xpage 引起的。
我们现在已经将 Ajax 调用链接到 Xpage,以便它们是同步的并且崩溃已经停止。
由于我们希望在未来的开发中更多地向 Xpages(Xagent 风格)调用 Ajax,我们想知道为什么会发生这种情况以及如何解决它。我们在javacode中找不到任何需要同步的代码。
这是已知问题吗?我们如何在不同步执行所有调用的情况下解决此问题?
导致错误的解决方案总结:
网页调用 Xpage,该 Xpage 在 afterRenderResponse 中通过 SSJS 调用 XAgent。 Javaclass 读取 Post Request 并通过 FacesContext 发回 JSON。
详细说明:
我们通过 Ajax POST 调用来调用 Xpage。有时,这些调用是由同一个用户对同一个 Xpage 并行执行的。 (那是我们崩溃的时候)
javascript (Angular) 中的 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
}
}
data 只是一个包含 requestdata 的对象,而 config 只是 HTTP 调用的配置。
Xpage 在 Xpage 的 AfterRenderResponse 事件中调用 javacode。 ((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();
}
【问题讨论】:
-
Domino 是否完全崩溃,需要重新启动它?
-
HTTP 任务崩溃并重启
-
log.nsf 或 logs in data/IBM_TECHNICAL_SUPPORT 是否提及与崩溃相关的任何内容(例如内存问题)?
-
不,我们正在监控内存和 jvm 内存,没有内存问题,也没有我们发送给 IBM 的故障转储中的详细信息。唯一的线索是它指向我们称之为问题的 xpage
-
“一个网页调用了一个 Xpage,它通过 afterRenderResponse 中的 SSJS 调用 XAgent”。我走了。
标签: xpages lotus-domino