state-leave
自 4.4 起
state-leave
命令与 state-enter 结合使用,以方便 订阅中的高级稳定。
state-leave
会导致一个监视不再被标记为处于特定的命名状态。
示例
这是最简单的示例,腾出一个名为 mystate
的状态
["state-leave", "/path/to/root", "mystate"]
它将导致任何订阅者从 watchman 服务器接收单方面的订阅 PDU
{
"subscription": "mysubscriptionname",
"root": "/path/to/root",
"state-leave": "mystate",
"clock": "c:1446410081:18462:7:135"
}
响应中的 clock
字段是在进入状态时(已同步;请参见下文)的时钟,并且可以与相应的 state-enter
订阅 PDU 时钟结合使用,以便在后续查询中找到在声明状态时发生更改的内容。
一个更复杂的示例演示了将元数据传递给任何订阅者。 metadata
字段被传播到订阅者,并且不会被 watchman 服务器解释。 它可以是任何 JSON 值。
["state-leave", "/path/to/root", {
"name": "mystate",
"metadata": {
"foo": "bar"
}
}]
这将向所有订阅者发出以下单方面的订阅 PDU
{
"subscription": "mysubscriptionname",
"root": "/path/to/root",
"state-leave": "mystate",
"clock": "c:1446410081:18462:7:137",
"metadata": {
"foo": "bar"
}
}
已放弃状态
当声明它的 watchman 客户端会话断开连接时,状态会被隐式腾出。 这有助于避免破坏订阅者(因为典型的操作是延迟或删除通知),如果启动状态的工具意外终止。
放弃的状态通过带有 abandoned
字段设置为 true
的单方面订阅 PDU 报告给任何订阅者
{
"subscription": "mysubscriptionname",
"root": "/path/to/root",
"state-leave": "mystate",
"clock": "c:1446410081:18462:7:137",
"abandoned": true
}
这允许订阅者采取适当的措施。
同步
状态与文件系统的状态同步,以便订阅者能够推理文件相对于状态何时发生更改。
这意味着发出 state-leave
命令将 执行查询同步 以确保事物同步。
state-leave
命令将使用 60 秒的默认 sync_timeout
。 如果在配置的 sync_timeout
内未观察到同步 Cookie,将返回一个错误,并且状态将不会被进入。
在某些情况下,可能是在对一个非常大的树进行初始爬取时,您可以为超时指定一个替代值; 该值以毫秒为单位表示
["state-leave", "/path/to/root", {
"name": "mystate",
"sync_timeout": 10000,
"metadata": {
"foo": "bar"
}
}]
您还可以为超时指定 0
以禁用此特定命令的同步。 这可能会导致状态在逻辑上看起来已经腾空,但实际上并没有腾空,因为在腾空状态时,watchman 尚未处理缓冲的通知。