385.4. 使用案例
385.4.1. 从 z 节点读取
以下片段将读取来自 znode/somepath/somenode/
提供的数据。检索的数据将放入交换中,并传递到路由的其余部分:
from("zookeeper://localhost:39913/somepath/somenode").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
的 ZooKeeper 的 EventType
值。如果最初读取数据(未由 WatchedEvent
触发)将不设置 CamelZookeeperEventType
标头。
385.4.3. 写入 z 节点
以下片段将交换的有效负载写入位于 /somepath/somenode/
的 znode 中(只要它已存在):
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");
如果节点不存在,应创建它,应使用 create
选项。
from("direct:create-and-write-to-znode") .to("zookeeper://localhost:39913/somepath/somenode?create=true");
启动 2.11 版本 也可以通过设置为 DELETE
来使用标头 CamelZookeeperOperation
删除节点 :
from("direct:delete-znode") .setHeader(ZooKeeperMessage.ZOOKEEPER_OPERATION, constant("DELETE")) .to("zookeeper://localhost:39913/somepath/somenode");
或者相当于:
<route> <from uri="direct:delete-znode" /> <setHeader headerName="CamelZookeeperOperation"> <constant>DELETE</constant> </setHeader> <to uri="zookeeper://localhost:39913/somepath/somenode" /> </route>
ZooKeeper 节点可以有不同的类型,可以是 'Ephemeral' 或 'Persistent' 和 'Sequenced' 或 'Unsequenced'。有关每种类型的更多信息,您可以查看 此处。默认情况下,端点将创建未排序的临时节点,但该类型可以通过 uri 配置参数或特殊的消息标头轻松操作。创建模式预期的值只是 CreateMode
enumeration 中的名称:
-
持久性
-
PERSISTENT_SEQUENTIAL
-
EPHEMERAL
-
EPHEMERAL_SEQUENTIAL
例如,通过 URI 配置创建持久的 znode :
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");