MarkLogic 10下通过Java API调用sjs、xqy文件及调试方法相关问题
Java应用调用MarkLogic 10 xqy/sjs脚本的实现方法
可以实现类Oracle存储过程的调用效果,你可以把业务逻辑封装在服务端xqy/sjs脚本中,Java端只负责传参调用、获取返回结果,具体操作步骤如下:
- 先将开发完成的xqy/sjs脚本部署到MarkLogic的*模块数据库(Modules Database)*中,也可以将脚本放在应用服务器文件系统的指定路径,再配置MarkLogic应用服务器的模块根目录指向该路径即可。
- Java端引入MarkLogic官方的
marklogic-client-api依赖,适配MarkLogic 10的稳定版本Maven配置示例如下:
<dependency> <groupId>com.marklogic</groupId> <artifactId>marklogic-client-api</artifactId> <version>5.5.0</version> </dependency>
- 初始化客户端连接后通过
ServerEvaluationCall接口调用脚本,示例代码如下:
// 初始化MarkLogic客户端连接 DatabaseClient client = DatabaseClientFactory.newClient( "服务端IP", 端口号, "目标内容数据库名", new DatabaseClientFactory.DigestAuthContext("用户名", "密码") ); // 构造脚本调用请求 ServerEvaluationCall call = client.newServerEval() // 替换为模块库中你的xqy/sjs脚本的实际路径 .modulePath("/custom-scripts/calculate-data.sjs") // 给脚本传参,参数名和脚本中声明的外部变量名对应即可 .addVariable("userId", 10086) .addVariable("dataType", "order"); // 执行调用并获取返回结果 EvalResult result = call.eval(); // 按实际业务需要转换返回结果格式,支持JSON、XML、文本等多种类型 String resultStr = result.getAs(String.class); // 释放连接 client.release();
如果是临时测试用的不需要复用的脚本,也可以直接把xqy/sjs代码字符串传给xquery()或javascript()方法直接执行,不需要提前部署到模块库。
xqy/sjs脚本的调试方法
常用的调试方式有三种:
Query Console在线调试
这是最常用的调试方案,MarkLogic自带的Query Console默认访问地址为http://你的MarkLogic服务端IP:8000/qconsole,操作流程如下:
- 选择脚本对应的内容数据库、模块数据库
- 导入待调试的xqy/sjs脚本,或者直接粘贴脚本代码
- 在需要打断点的位置插入断点语句:xqy语法为
xdmp:breakpoint(),sjs语法为xdmp.breakpoint() - 切换到调试模式运行脚本,即可实现单步执行、查看实时变量值、查看调用栈等调试操作
日志输出调试
适合线上环境快速定位问题:
- xqy脚本使用
xdmp:log("输出内容", "debug")打印日志,可以自定义info、warn、error等日志级别 - sjs脚本使用
xdmp.log("输出内容", "debug"),用法和xqy完全一致 - MarkLogic 10默认日志存储路径:Linux环境为
/var/opt/MarkLogic/Logs/ErrorLog.txt,Windows环境为C:\Program Files\MarkLogic\Data\Logs\ErrorLog.txt
单元测试调试
复杂业务逻辑的脚本可以用MarkLogic官方的test-framework单元测试框架编写测试用例,支持自定义断言、异常捕获、批量执行测试用例,适合全量回归测试时定位逻辑问题。
内容的提问来源于stack exchange,提问作者hdew
相关产品推荐
相关产品推荐

