325.15. 将正文和标头存储为文本
可从 Camel 2.11 开始
您可以配置 JdbcAggregationRepository 来存储消息正文,并在单独的列中选择(ed)标头作为 String。例如,要存储正文,以下两个标题为 companyName 和 accountName,使用以下 SQL:
CREATE TABLE aggregationRepo3 ( id varchar(255) NOT NULL, exchange blob NOT NULL, body varchar(1000), companyName varchar(1000), accountName varchar(1000), constraint aggregationRepo3_pk PRIMARY KEY (id) ); CREATE TABLE aggregationRepo3_completed ( id varchar(255) NOT NULL, exchange blob NOT NULL, body varchar(1000), companyName varchar(1000), accountName varchar(1000), constraint aggregationRepo3_completed_pk PRIMARY KEY (id) );
然后,将存储库配置为启用此行为,如下所示:
<bean id="repo3"
class="org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository">
<property name="repositoryName" value="aggregationRepo3"/>
<property name="transactionManager" ref="txManager3"/>
<property name="dataSource" ref="dataSource3"/>
<!-- configure to store the message body and following headers as text in the repo -->
<property name="storeBodyAsText" value="true"/>
<property name="headersToStoreAsText">
<list>
<value>companyName</value>
<value>accountName</value>
</list>
</property>
</bean>325.15.1. codec (导航)
由于它们可以包含任何类型的有效负载,因此设计交换并不被序列化。它转换为数据库 BLOB 字段中存储的字节阵列。所有这些转换都由 JdbcCodec 类处理。代码细节需要您关注: ClassLoadingAwareObjectInputStream。
ClassLoadingAwareObjectInputStream 已从 Apache ActiveMQ 项目中重复使用。它将打包了 ObjectInputStream,并将其与 ContextClassLoader 而非当前Thread 一起一起使用。这样做的好处是能够加载由其他捆绑包公开的类。这允许交换正文和标头具有自定义类型对象引用。