143.5. Spring Boot Auto-Configuration
组件支持 4 个选项,如下所列。
| Name | 描述 | 默认值 | 类型 |
|---|---|---|---|
| camel.component.hbase.configuration | 使用共享配置。选项是 org.apache.hadoop.conf.Configuration 类型。 | 字符串 | |
| camel.component.hbase.enabled | 启用 hbase 组件 | true | 布尔值 |
| camel.component.hbase.pool-max-size | HTable 池中为每个表保留的最大引用数。默认值为 10。 | 10 | 整数 |
| camel.component.hbase.resolve-property-placeholders | 组件是否应在启动时解析属性占位符。只有 String 类型的属性可以使用属性占位符。 | true | 布尔值 |
143.5.1. Put Operations (放置操作) 复制链接链接已复制到粘贴板!
HBase 是基于列的存储,允许您将数据存储在特定行的特定列中。列分组为系列,因此要指定一个列,您需要指定列系列和该列的限定符。要将数据存储到特定的列中,您需要同时指定列和行。
将数据存储在 HBase 中的 camel 路由中的最简单场景是将消息正文的一部分存储到指定的 HBase 列。
<route>
<from uri="direct:in"/>
<!-- Set the HBase Row -->
<setHeader headerName="CamelHBaseRowId">
<el>${in.body.id}</el>
</setHeader>
<!-- Set the HBase Value -->
<setHeader headerName="CamelHBaseValue">
<el>${in.body.value}</el>
</setHeader>
<to uri="hbase:mytable?operation=CamelHBasePut&family=myfamily&qualifier=myqualifier"/>
</route>
上面的路由假定消息正文包含一个具有 id 和 value 属性的对象,并将值的内容存储在 id 指定的行中的 HBase 列 myfamily:myqualifier 中。如果我们需要指定多个列/值对,我们可以仅指定额外的列映射。请注意,您必须使用结果上的第 2 个标头中的数字,如 RowId2、RowId3、RowId4 等。只有第一代标题没有数字 1。
<route>
<from uri="direct:in"/>
<!-- Set the HBase Row 1st column -->
<setHeader headerName="CamelHBaseRowId">
<el>${in.body.id}</el>
</setHeader>
<!-- Set the HBase Row 2nd column -->
<setHeader headerName="CamelHBaseRowId2">
<el>${in.body.id}</el>
</setHeader>
<!-- Set the HBase Value for 1st column -->
<setHeader headerName="CamelHBaseValue">
<el>${in.body.value}</el>
</setHeader>
<!-- Set the HBase Value for 2nd column -->
<setHeader headerName="CamelHBaseValue2">
<el>${in.body.othervalue}</el>
</setHeader>
<to uri="hbase:mytable?operation=CamelHBasePut&family=myfamily&qualifier=myqualifier&family2=myfamily&qualifier2=myqualifier2"/>
</route>
务必要记住,您可以使用 uri 选项、消息标头或这两者的组合。建议将常量指定为 uri 和 dynamic 值的一部分,作为标头的一部分。如果某个项同时定义为标头和作为 uri 的一部分,则将使用标头。
143.5.2. 获取运营. 复制链接链接已复制到粘贴板!
Get Operation 是一个操作,用于从指定的 HBase 行中检索一个或多个值。要指定您要检索的值,您只需将它们指定为 uri 的一部分,或作为消息标头的一部分。
<route>
<from uri="direct:in"/>
<!-- Set the HBase Row of the Get -->
<setHeader headerName="CamelHBaseRowId">
<el>${in.body.id}</el>
</setHeader>
<to uri="hbase:mytable?operation=CamelHBaseGet&family=myfamily&qualifier=myqualifier&valueType=java.lang.Long"/>
<to uri="log:out"/>
</route>
在上例中,get 操作的结果将存储为名为 CamelHBaseValue 的标头。
143.5.3. 删除操作. 复制链接链接已复制到粘贴板!
您还可以 camel-hbase 来执行 HBase delete 操作。删除操作将删除一行。所有需要指定的一行或多行作为消息标头的一部分。
<route>
<from uri="direct:in"/>
<!-- Set the HBase Row of the Get -->
<setHeader headerName="CamelHBaseRowId">
<el>${in.body.id}</el>
</setHeader>
<to uri="hbase:mytable?operation=CamelHBaseDelete"/>
</route>
143.5.4. 扫描操作. 复制链接链接已复制到粘贴板!
扫描操作等同于 HBase 中的查询。您可以使用扫描操作来检索多行。要指定哪些列应该是结果的一部分,并指定如何将值转换为对象,您可以使用 uri 选项或标头。
<route>
<from uri="direct:in"/>
<to uri="hbase:mytable?operation=CamelHBaseScan&family=myfamily&qualifier=myqualifier&valueType=java.lang.Long&rowType=java.lang.String"/>
<to uri="log:out"/>
</route>
在这种情况下,您还需要指定一个过滤器列表来限制结果。您可以将过滤器列表指定为 uri 的一部分,camel 只返回满足 ALL 过滤器的行。
要使过滤器可以了解消息一部分的信息,camel 定义了 ModelAwareFilter。这样,您的过滤器可以考虑消息和映射策略定义的模型。
当使用 ModelAwareFilter camel-hbase 时,会将所选映射策略应用到 in 消息,会创建一个模型映射的对象,并将该对象传递给 Filter。
例如,要使用 作为消息标头的条件来执行扫描,您可以使用 ModelAwareColumnMatchingFilter,如下所示。
<route>
<from uri="direct:scan"/>
<!-- Set the Criteria -->
<setHeader headerName="CamelHBaseFamily">
<constant>name</constant>
</setHeader>
<setHeader headerName="CamelHBaseQualifier">
<constant>first</constant>
</setHeader>
<setHeader headerName="CamelHBaseValue">
<el>in.body.firstName</el>
</setHeader>
<setHeader headerName="CamelHBaseFamily2">
<constant>name</constant>
</setHeader>
<setHeader headerName="CamelHBaseQualifier2">
<constant>last</constant>
</setHeader>
<setHeader headerName="CamelHBaseValue2">
<el>in.body.lastName</el>
</setHeader>
<!-- Set additional fields that you want to be return by skipping value -->
<setHeader headerName="CamelHBaseFamily3">
<constant>address</constant>
</setHeader>
<setHeader headerName="CamelHBaseQualifier3">
<constant>country</constant>
</setHeader>
<to uri="hbase:mytable?operation=CamelHBaseScan&filters=#myFilterList"/>
</route>
<bean id="myFilters" class="java.util.ArrayList">
<constructor-arg>
<list>
<bean class="org.apache.camel.component.hbase.filters.ModelAwareColumnMatchingFilter"/>
</list>
</constructor-arg>
</bean>
上面的路由假定 pojo 具有属性 firstName 和 lastName 作为消息正文传递,它会采用这些属性,并将它们添加为消息标头的一部分。默认映射策略会创建一个模型对象,它将把标头映射到 HBase 列,并传递模型 ModelAwareColumnMatchingFilter。过滤器将过滤掉任何行,它们不包含与模型匹配的列。类似于通过 example 的查询。