如何通过extractRefresh任务ID筛选Tableau Server REST API中的作业?
关于Tableau REST API按任务ID筛选作业的问题
核心需求
想通过Tableau REST API的/runNow接口手动触发Extract刷新任务,但需要先检查该任务对应的作业是否正在运行。尝试通过jobs端点用任务ID筛选关联作业,但筛选逻辑不生效。
问题本质
Tableau REST API的/sites/{siteId}/jobs端点不支持直接用任务ID作为筛选条件:
你尝试的filter=args:has:{taskID}之所以无效,是因为args字段存储的是序列化的XML结构(包含任务ID、数据源信息等),has过滤器只能匹配字符串片段,无法精准定位到任务ID节点,容易出现误匹配。
可行解决方案
方案1:遍历运行中作业并解析任务ID(兼容全版本)
先筛选出所有状态为Running的作业,再逐个解析作业的args字段,提取其中的任务ID进行匹配:
public bool CheckIfExtractRefreshIsRunning(string targetTaskId) { bool isRunning = false; try { // 1. 获取所有运行中的作业 string jobsUrl = $"{server}/api/{version}/sites/{site}/jobs?filter=status:eq:Running"; WebRequest jobsReq = WebRequest.Create(jobsUrl); jobsReq.Headers.Add("X-Tableau-Auth", token); using (WebResponse jobsResp = jobsReq.GetResponse()) { XmlDocument jobsXml = new XmlDocument(); jobsXml.Load(jobsResp.GetResponseStream()); XmlNamespaceManager nsManager = new XmlNamespaceManager(jobsXml.NameTable); nsManager.AddNamespace("t", "http://tableau.com/api"); // 2. 遍历每个运行中的作业 var runningJobs = jobsXml.SelectNodes("//t:job", nsManager); foreach (XmlNode jobNode in runningJobs) { // 3. 解析作业的args字段,提取任务ID XmlNode argsNode = jobNode.SelectSingleNode("t:args", nsManager); if (argsNode != null) { // 加载args内部的XML内容 XmlDocument argsXml = new XmlDocument(); argsXml.LoadXml(argsNode.InnerXml); XmlNode taskIdNode = argsXml.SelectSingleNode("//taskId"); if (taskIdNode != null && taskIdNode.InnerText == targetTaskId) { isRunning = true; break; } } } } } catch (Exception e) { throw e; } return isRunning; }
使用时,先通过/tasks/extractRefreshes获取目标任务的ID,再传入这个方法即可判断。
方案2:使用新版本的taskId筛选器(仅Tableau Server 2021.3+可用)
Tableau Server 2021.3及以后的版本,jobs端点新增了taskId筛选器,可以直接按任务ID筛选:
// 仅支持2021.3+版本的API string jobsUrl = $"{server}/api/{version}/sites/{site}/jobs?filter=taskId:eq:{targetTaskId}&filter=status:eq:Running";
这个方式更高效,不需要遍历解析,但要注意版本兼容性。
补充说明
调用/runNow接口时,如果对应的任务已有运行中的作业,Tableau会返回409 Conflict错误,也可以通过捕获这个异常来判断作业是否在运行,作为备选方案。
内容的提问来源于stack exchange,提问作者happycoder2121
相关产品推荐
相关产品推荐

