Xquery 如何使用app server id在eval.xqy文件中执行查询

Xquery 如何使用app server id在eval.xqy文件中执行查询,xquery,marklogic,marklogic-7,Xquery,Marklogic,Marklogic 7,我需要运行从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,

我需要运行从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]
若我有import modules语句,那个么它会抛出错误(找不到文件)

因此,我尝试获取应用程序服务器id,并尝试传递该id,而不是如下所示的数据库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以使查询针对特定的应用服务器执行。

这是MarkLogic 8还是更早的版本(我问这个问题是因为8上的重写选项允许在执行之前动态切换模块数据库(还有许多其他惊人的优点)。这可能是您想要的,因为此时您可以查看查询参数,并将逻辑构建到重新布线规则中

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

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

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

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

  • 重定向到正确的节点
  • 可能使用当前节点代表您发出请求
  • 但是这会将第一个线程和另一个节点上的线程绑定在一起,并且会产生HTTP通信开销——为此,您需要一个应用程序服务器进行监听
  • 如果这是一种火灾和遗忘类型的情况,那么您可以点击任何节点,并使用URI命名约定将数据/请求保存在DB中的文档中,该命名约定指示应用程序服务器的用途,并通过插入触发器(其服务器id带有URI前缀)从DB中提取请求并进行处理

我们正在使用ML 7。我们有20多个集群用于开发和测试。在每个集群中,我们都有多个应用服务器。如果我们需要在任何集群的cq中执行查询,我们需要转到该集群。相反,我正在开发一个工具,在下拉列表中填充所有集群。如果我选择了一个集群,所有应用服务器都将被删除在另一个下拉列表中列出。我在文本区域中有查询。如果我执行查询,它应该针对我选择的应用程序服务器执行。我尝试了数据库而不是应用程序服务器。这对于简单查询很好,但没有像我在问题中所说的那样工作。您是否表示您正在尝试在不同节点上访问应用程序服务器你不是真的发到了吗?