1

我需要通过从 pod 导入模块来运行查询。

如果我使用下面的数据库 ID 运行简单查询,则无需导入模块,它就可以工作。

let $queryParam := fn:concat("?query=",xdmp:url-encode($query),"&eval=",$dataBaseId,":123")
let $url := fn:concat($hostcqport,"/eval.xqy",$queryParam)

let $response := xdmp:http-post($url, $options)[2]

如果我有导入模块语句,那么它会抛出错误(找不到文件)。

所以我尝试获取 app-server id 并尝试传递它而不是 database-id,如下所示,

let $queryParam := fn:concat("?query=",xdmp:url-encode($query),"&eval=",$serverId,":123")
let $url := fn:concat($hostcqport,"/eval.xqy",$queryParam)

let $response := xdmp:http-post($url, $options)[2]

如何传递服务器 ID 以使查询针对特定的应用服务器执行。

4

1 回答 1

1

这是 MarkLogic 8 或更早版本吗(我问是因为 8 上的重写选项允许在执行之前动态切换模块数据库(在许多其他令人惊叹的好东西中)。这可能是您想要的,因为您可以在此时查看查询参数和将逻辑构建到重写规则中。

否则,您能否更详细地解释您最终要完成的工作。当您的代码运行时,它已经在特定应用服务器的上下文中执行 - 因此通过分析查询参数要求对另一个应用服务器执行有点太晚了(因为您已经在使用应用服务器)。

[编辑]以下是对自提供以来的评论的回应。这是一个混乱的回应,因为实际的票和评论仍然不是一个完全清晰的画面。但是,如果您将它们拼接在一起,那么现在确实存在我可以回应的问题陈述。

该问题的原始作者通过评论确认他们“试图在与您实际发布的节点不同的节点上访问应用服务器”

好的..这是对澄清的回应:这是不可能的。您的请求已由您使用 http 请求命中的节点上的线程处理。Marklogic 是一个集群,但它不共享线程(或其他任何东西)。选择是:

  • 重定向到正确的节点
  • 可能使用当前节点代表您提出请求。
  • 但这将第一个线程和另一个节点上的线程联系在一起,并产生了 HTTP 通信开销——并且您需要有一个应用程序服务器为此目的进行侦听。
  • 如果这是一种即发即弃的情况,那么您可以点击任何节点并将数据/请求保存在数据库中的文档中,使用指示它用于哪个应用服务器的 URI 命名约定,并通过插入触发器(其服务器 ID 带有 URI 前缀),从数据库中获取请求并处理它。
于 2016-03-04T08:35:44.783 回答