142.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 只返回满足所有过滤器的行。
要有一个可以了解作为消息一部分的信息的过滤器,camel 定义 ModelAwareFilter。这将允许您的过滤器考虑消息和映射策略定义的模型。
当使用 ModelAwareFilter camel-hbase 时,将所选映射策略应用到消息中,这将创建一个对象来建模映射,并将该对象传递到 Filter。
例如,要使用 作为消息标头执行扫描,您可以使用 ModelAwareColumnMatchFilter,如下所示。
<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。过滤器将过滤出任何行,它们不包含与模型匹配的列。它类似于以下示例查询。