BaseX 是否支持使用作业模块或查询与 proc 模块和作业模块的组合运行 basex 脚本文件 (.bxs)?

问题描述

这一直困扰着我,我想知道我是否遗漏了一些简单的东西。我需要从作业调度程序运行 .bxs 脚本。

我尝试使用来自作业模块的 .bxs 脚本文件启动服务,但它没有运行。它注册为服务,但脚本不运行。

let $home := Q{org.basex.util.Prop}HOMEDIR()
let $job :=  $home || 'webapp/sync/update_jira.bxs'
let $job2 := $home || 'webapp/sync/update_commit_data.bxs'
return (jobs:eval(xs:anyURI($job),(),map { 'id':'update_jira_job','start':'14:54:02','interval':'P1D','service': true(),'log': 'update_jira_job'}),jobs:eval(xs:anyURI($job2),map { 'id':'update_commit_data','start':'15:03:02','log': 'update_commit_data'}))

我还尝试运行执行命令行以运行脚本的查询,例如在 update_jira.xq 中有一行 proc:execute('basex update_jira.bxs') 来自初始查询,看起来像这样...

let $home := Q{org.basex.util.Prop}HOMEDIR()
let $job :=  $home || '/srv/webapp/sync/update_jira.xq'
let $job2 := $home || '/src/webapp/sync/update_commit_data.xq'
return (jobs:eval(xs:anyURI($job),'log': 'update_commit_data'}))

当它作为服务运行时,数据库没有按预期更新,我在日志中得到了这个输出

22:47:02.001    JOB:update_commit_data  admin   OK  0.30    update_commit_data
22:41:00.000    JOB:update_jira_job admin   ERROR   0.00    update_jira_job; Unexpected end of query: '0'.

但这很奇怪,因为当我运行查询本身时——用jobs:eval启动服务——然后当我第一次运行查询时它实际上运行正常。

16:42:52.257    10.244.144.142:57444    admin   200 221563.70   [GET] /rest?run=sync/update_jira.bxs
16:49:39.862    10.244.144.142:57591    admin   200 101413.21   [GET] /rest?run=sync/update_commit_data.bxs

这是我的最新尝试,其中查询最初运行但随后似乎没有作为服务间隔执行。我添加了 base-uri 作为查询的路径,我希望这是正确的方法

let $home := Q{org.basex.util.Prop}HOMEDIR()
return jobs:eval(proc:execute('/usr/local/bin/basex','/srv/basex/webapp/sync/update_jira.bxs'),'interval':'PT5M','base-uri': '/srv/basex/webapp/sync/','log': 'update_jira_job'})

当我通过数据库管理工具查询窗口运行它时,它立即运行

14:02:54.494    10.244.144.142:54402    admin   200 296095.32   [POST] /dba/query-update

然后在 5 分钟间隔后,服务启动时会显示 0.05 毫秒的日志条目:

14:57:50.564    JOB:update_jira_job admin   OK  0.05    update_jira_job

解决方法

请注意,BaseX 命令脚本包含普通的数据库命令,而 Jobs 模块中的函数是为执行 XQuery 代码而定制的。如果要使用 jobs:eval,最好的解决方案是将命令脚本的内容重写为 XQuery。

如果您想坚持使用命令脚本,您确实可以尝试通过 proc:execute 调用 BaseX,但您应该意识到这两个 BaseX 实例将彼此独立运行并可能导致数据库损坏(见https://docs.basex.org/wiki/Startup#Concurrent_Operations)。

如果调用失败...

Cannot run program "basex": CreateProcess error=2,...

...您可能需要使用完整路径来解决 BaseX:

(: Windows installation :)
proc:execute('c:\Program Files (x86)\BaseX\bin\basex.bat','commands.bxs')
(: Linux :)
proc:execute('/path/to/basex','commands.bxs')