跳到主要内容

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 尚未处理缓冲的通知。