旧Notes应用XPages REST Service并发调用异常排查求助
XPages REST服务多请求冲突问题排查方向
我正在排查一款旧Notes应用的问题:该应用用XPages REST Service控件对外提供API,XPage引用了包含REST核心逻辑的SSJS脚本库。示例代码如下:
<xe:restService id="restService4" pathInfo="userRegistration"> <xe:this.service> <xe:customRestService contentType="application/json" requestContentType="application/json" requestVar="userRegistration" doPost="#{javascript:RegisterCustomer(userRegistration)}"> </xe:customRestService> </xe:this.service> </xe:restService>
其中RegisterCustomer是SSJS库中的核心函数,负责POST请求体验证、数据查询,以及创建包含提交和查询数据的Notes文档。
单请求场景下一切正常,但同时接收多个请求时会出现各类错误,比如SSJS函数中使用NotesView对象时提示“Object has been removed or recycled”。已通过Postman性能测试复现问题,需要检查以下内容确保所有REST服务调用独立运行、互不干扰:
- 排查SSJS脚本库的全局变量:如果
RegisterCustomer函数或脚本库中存在函数外定义的全局变量(比如NotesSession、NotesDatabase、NotesView等对象),这些变量会被所有请求共享,一个线程回收对象后,另一个线程再访问就会触发报错。必须确保所有Notes对象都在函数内部局部声明、使用,用完及时回收。 - 验证Notes对象的回收逻辑:SSJS的自动回收机制在高并发场景下可能有延迟,手动创建的NotesView、NotesDocument等对象,要在函数执行完毕前显式调用
recycle()方法,且避免在循环或分支中遗漏回收。注意不要回收requestVar传入的对象,以及平台自动注入的session、database等对象。 - 检查视图与文档的并发访问方式:如果使用了共享的视图实例,或者多线程同时操作同一文档,会导致对象状态异常。确保每次查询都重新获取视图实例,对文档操作时使用
lock()方法加锁,避免并发修改冲突。 - 确认XPages的线程隔离配置:查看XPage的
viewState属性,若设置为"shared"会导致状态共享,改为"nostate"或"client"可减少服务器端状态共享风险。同时确认customRestService未配置共享上下文对象。 - 排查SSJS中的静态缓存或共享数据结构:如果脚本库中用了全局缓存(比如
var cache = cache || {}这种写法),会导致多个请求共享缓存数据,甚至缓存已回收的Notes对象。必须将缓存改为请求级别的局部缓存,或使用线程安全的缓存机制。 - 检查Domino服务器线程池配置:HTTP线程池配置过小会导致请求排队或线程复用异常,查看服务器配置文档中的HTTP线程数设置,确保足够处理并发请求。
- 验证请求数据处理的线程安全性:确认
userRegistration请求体的解析过程没有使用共享对象存储临时数据,所有请求相关数据都保存在局部变量中。
内容的提问来源于stack exchange,提问作者Martin Perrie
相关产品推荐
相关产品推荐

