385.4. 使用案例
385.4.1. 从 znode读取
以下片段将从 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
的 EventType
值。如果初始读取数据(不是由 WatchedEvent
触发),则不会设置 CamelZookeeperEventType
标头。
385.4.3. 写入一个 znode
以下片段会将交换的有效负载写入位于 /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 版本 也可以使用标头 CamelZookeeperOperation
删除节点,方法是将其设置为 DELETE
:
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 配置参数或特殊消息标头轻松操作。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");
或使用标头 CamelZookeeperCreateMode
。
testPayload
必须转换为 byte[]
,因为 ZooKeeper 中存储的数据是基于字节的。
Object testPayload = ... template.sendBodyAndHeader("direct:create-and-write-to-persistent-znode", testPayload, "CamelZooKeeperCreateMode", "PERSISTENT");