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

时间:2016-03-03 11:35:06

标签: 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, $options)[2]

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

所以我尝试获取app-server 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]

如何传递server-id以使查询针对特定的app-server执行。

1 个答案:

答案 0 :(得分:1)

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

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

[edit] 以下内容是对自提供的评论的回应。这是一个混乱的回应,因为实际的票和评论仍然不是一个完全清晰的图片。但如果你把它们拼接在一起,那么现在就存在一个我可以回复的问题陈述。

该问题的原作者通过评论确认他们"尝试在不同于您实际发布的节点上的应用服务器上点击"

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

  • 重定向到正确的节点
  • 可能使用当前节点代表您发出请求。
  • 但是这会占用第一个线程和另一个节点上的线程并且具有HTTP通信开销 - 并且您需要让应用服务器监听此目的。
  • 如果这是一种即发即弃的情况,那么您可以使用URI命名约定命中任何节点并将数据/请求保存在数据库中的文档中,该命名约定指示它适用于哪个应用服务器,以及插入触发器的方式(使用其服务器ID的URI前缀),从数据库中获取请求并处理它。