2.6.3. 端点绑定
什么是绑定?
在 Apache Camel 中,绑定 是一种在 contract 中嵌套端点的方法,例如,通过应用数据格式、内容增强或验证步骤来嵌套端点。条件或转换适用于即将进入的消息,并将互补条件或转换应用到消息。
DataFormatBinding
对于您要定义 marshals 和 unmarshals 是一个特定数据格式的绑定,DataFormatBinding
类对特定数据格式很有用。第 2.6.2 节 “marshalling 和 Unmarshalling”在这种情况下,您需要创建绑定的过程都是创建一个 DataFormatBinding
实例,传递对构造器中相关数据格式的引用。
例如,例 2.2 “JAXB Binding” 中的 XML DSL 片断显示一个绑定(带有 ID、jaxb
)的绑定(带有 ID、jaxb ),在与 Apache Camel 端点相关联时,它可以编出 JAXB 数据格式:
例 2.2. JAXB Binding
<beans ... >
...
<bean id="jaxb" class="org.apache.camel.processor.binding.DataFormatBinding">
<constructor-arg ref="jaxbformat"/>
</bean>
<bean id="jaxbformat" class="org.apache.camel.model.dataformat.JaxbDataFormat">
<property name="prettyPrint" value="true"/>
<property name="contextPath" value="org.apache.camel.example"/>
</bean>
</beans>
将绑定与端点关联
以下的 alternatives 可用于将绑定与端点相关联:
绑定 URI
要将绑定与端点关联,您可以将端点 URI 与 binding:NameOfBinding
为前缀,其中 NameOfBinding
是绑定的 Bean ID (例如,Spring XML 中创建绑定 ID)。
例如,以下示例显示了如何将 ActiveMQ 端点与 例 2.2 “JAXB Binding” 中定义的 JAXB 绑定关联。
<beans ...> ... <camelContext xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="binding:jaxb:activemq:orderQueue"/> <to uri="binding:jaxb:activemq:otherQueue"/> </route> </camelContext> ... </beans>
BindingComponent
您不需要使用前缀来与端点关联,而是让关联隐式,以便该绑定不需要出现在 URI 中。对于没有隐式绑定的现有端点,达到此目的的最简单方法是使用 BindingComponent
类嵌套端点。
例如,要将 jaxb
绑定与 activemq
端点关联,您可以定义一个新的 BindingComponent
实例,如下所示:
<beans ... >
...
<bean id="jaxbmq" class="org.apache.camel.component.binding.BindingComponent">
<constructor-arg ref="jaxb"/>
<constructor-arg value="activemq:foo."/>
</bean>
<bean id="jaxb" class="org.apache.camel.processor.binding.DataFormatBinding">
<constructor-arg ref="jaxbformat"/>
</bean>
<bean id="jaxbformat" class="org.apache.camel.model.dataformat.JaxbDataFormat">
<property name="prettyPrint" value="true"/>
<property name="contextPath" value="org.apache.camel.example"/>
</bean>
</beans>
其中(可选)第二个构造器参数到 jaxbmq
定义 URI 前缀。现在,您可以使用 jaxbmq
ID 作为端点 URI 的方案。例如,您可以使用此绑定组件定义以下路由:
<beans ...> ... <camelContext xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="jaxbmq:firstQueue"/> <to uri="jaxbmq:otherQueue"/> </route> </camelContext> ... </beans>
前面的路由等同于以下路由,它使用绑定 URI 方法:
<beans ...> ... <camelContext xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="binding:jaxb:activemq:foo.firstQueue"/> <to uri="binding:jaxb:activemq:foo.otherQueue"/> </route> </camelContext> ... </beans>
对于实施自定义 Apache Camel 组件的开发人员,可以通过实施从 org.apache.camel.spi.HasBinding
接口继承的端点类来实现此目的。
BindingComponent constructors
BindingComponent
类支持以下构造器:
public BindingComponent()
- 无参数形式。使用属性注入配置绑定组件实例。
public BindingComponent(Binding binding)
-
将此绑定组件与指定的
绑定
对象绑定
相关联。 public BindingComponent(Binding binding, String uriPrefix)
-
将此绑定组件与指定的
Binding
对象、绑定和
URI 前缀关联。uriPrefix
。这是最常用的构造器。 public BindingComponent (Binding binding, String uriPrefix, String uriPostfix)
-
这个构造器支持额外的 URI post-fix,
uriPostfix
的参数,该参数自动附加到使用此绑定组件定义的任何 URI。
实现自定义绑定
除了用于 marshalling 和 unmarshalling 数据格式的 DataFormatBinding
外,您还可以实施自己的自定义绑定。定义自定义绑定,如下所示:
-
实施
org.apache.camel.Processor
类,对传入消费者端点的消息进行转换(从
元素中讲)。 -
实施互补
org.apache.camel.Processor
类,对来自生产端点(应用到
元素)传出的消息执行反向转换。 -
实施
org.apache.camel.spi.Binding
接口,该接口充当处理器实例的工厂。
绑定接口
例 2.3 “org.apache.camel.spi.Binding 接口” 显示 org.apache.camel.spi.Binding
接口的定义,您必须实施这些接口来定义自定义绑定。
例 2.3. org.apache.camel.spi.Binding 接口
// Java package org.apache.camel.spi; import org.apache.camel.Processor; /** * Represents a <a href="http://camel.apache.org/binding.html">Binding</a> or contract * which can be applied to an Endpoint; such as ensuring that a particular * <a href="http://camel.apache.org/data-format.html">Data Format</a> is used on messages in and out of an endpoint. */ public interface Binding { /** * Returns a new {@link Processor} which is used by a producer on an endpoint to implement * the producer side binding before the message is sent to the underlying endpoint. */ Processor createProduceProcessor(); /** * Returns a new {@link Processor} which is used by a consumer on an endpoint to process the * message with the binding before its passed to the endpoint consumer producer. */ Processor createConsumeProcessor(); }
何时使用绑定
当您需要将同一类型转换应用到许多不同类型的端点时,绑定非常有用。