385.4. 使用案例
385.4.1. 从 znode读取 复制链接链接已复制到粘贴板!
以下片段将从 znode/somepath/somenode/ 中读取它已存在的数据。检索的数据将放入交换中,并传递给路由的其余部分:
from("zookeeper://localhost:39913/somepath/somenode").to("mock:result");
from("zookeeper://localhost:39913/somepath/somenode").to("mock:result");
如果节点尚不存在,则可以提供标志来让端点等待其创建:
from("zookeeper://localhost:39913/somepath/somenode?awaitCreation=true").to("mock:result");
from("zookeeper://localhost:39913/somepath/somenode?awaitCreation=true").to("mock:result");
385.4.2. 从 znode 读取(额外 Camel 2.10 开始) 复制链接链接已复制到粘贴板!
当因为从 ZooKeeper ensemble 收到的 WatchedEvent 中读取数据时,CamelZookeeperEventType 标头包含来自该 WatchedEvent 的 EventType 值。如果初始读取数据(不是由 WatchedEvent触发),则不会设置 CamelZookeeperEventType 标头。
385.4.3. 写入一个 znode 复制链接链接已复制到粘贴板!
以下片段会将交换的有效负载写入位于 /somepath/somenode/ 的 znode 中,前提是它已存在:
from("direct:write-to-znode")
.to("zookeeper://localhost:39913/somepath/somenode");
from("direct:write-to-znode")
.to("zookeeper://localhost:39913/somepath/somenode");
为获得灵活性,端点允许将目标 znode 动态指定为消息标头。如果存在由字符串 CamelZooKeeperNode 键的标头,则标头的值将用作服务器上 znode 的路径。例如,使用上述同一路由定义,以下代码片段会将数据写入 /somepath/somenode,而是写入标题 /somepath/someothernode 的路径。
testPayload 必须转换为 byte[],因为 ZooKeeper 中存储的数据是基于字节的。
Object testPayload = ...
template.sendBodyAndHeader("direct:write-to-znode", testPayload, "CamelZooKeeperNode", "/somepath/someothernode");
Object testPayload = ...
template.sendBodyAndHeader("direct:write-to-znode", testPayload, "CamelZooKeeperNode", "/somepath/someothernode");
如果不存在 create 选项,则也会创建该节点。
from("direct:create-and-write-to-znode")
.to("zookeeper://localhost:39913/somepath/somenode?create=true");
from("direct:create-and-write-to-znode")
.to("zookeeper://localhost:39913/somepath/somenode?create=true");
启动 2.11 版本 也可以使用标头 CamelZookeeperOperation 删除节点,方法是将其设置为 DELETE :
from("direct:delete-znode")
.setHeader(ZooKeeperMessage.ZOOKEEPER_OPERATION, constant("DELETE"))
.to("zookeeper://localhost:39913/somepath/somenode");
from("direct:delete-znode")
.setHeader(ZooKeeperMessage.ZOOKEEPER_OPERATION, constant("DELETE"))
.to("zookeeper://localhost:39913/somepath/somenode");
或者等效于:
ZooKeeper 节点可以有不同的类型,可以是 'Ephemeral' 或 'Persistent' 和 'Sequenced' 或 'Unsequenced'。有关每种类型的更多信息,您可以检查 此处。默认情况下,端点将创建未排序的临时节点,但类型可以通过 uri 配置参数或特殊消息标头轻松操作。create 模式预期的值只是来自 CreateMode 枚举的名称:
-
持久性 -
持久性_SEQUENTIAL -
EPHEMERAL -
EPHEMERAL_SEQUENTIAL
例如,通过 URI 配置创建持久性 znode :
from("direct:create-and-write-to-persistent-znode")
.to("zookeeper://localhost:39913/somepath/somenode?create=true&createMode=PERSISTENT");
from("direct:create-and-write-to-persistent-znode")
.to("zookeeper://localhost:39913/somepath/somenode?create=true&createMode=PERSISTENT");
或使用标头 CamelZookeeperCreateMode。
testPayload 必须转换为 byte[],因为 ZooKeeper 中存储的数据是基于字节的。
Object testPayload = ...
template.sendBodyAndHeader("direct:create-and-write-to-persistent-znode", testPayload, "CamelZooKeeperCreateMode", "PERSISTENT");
Object testPayload = ...
template.sendBodyAndHeader("direct:create-and-write-to-persistent-znode", testPayload, "CamelZooKeeperCreateMode", "PERSISTENT");