46.16. 将正文和标头存储为文本
您可以配置 JdbcAggregationRepository
,以存储邮件正文,并在单独的列中选择(ed)标头作为 String。例如,要存储正文,以下两个标头 companyName
和 accountName
则使用以下 SQL:
CREATE TABLE aggregationRepo3 ( id varchar(255) NOT NULL, exchange blob NOT NULL, version BIGINT 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, version BIGINT 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>
46.16.1. codec(推荐)
由于它们可以包含任何类型的有效负载,因此根据设计,Exchanges 不可序列化。它将转换为字节阵列,以存储在数据库 BLOB 字段中。所有这些转换都由 JdbcCodec
类来处理。代码的详情需要您注意: ClassLoadingAwareObjectInputStream
。
ClassLoadingAwareObjectInputStream
已从 Apache ActiveMQ 项目中重复使用。它嵌套了 ObjectInputStream
,并将其与 ContextClassLoader
一起使用,而不是 当前Thread
。这样做的好处是能够加载由其他捆绑包公开的类。这允许交换正文和标头具有自定义类型对象引用。