326.15. 본문 및 헤더를 텍스트로 저장
Camel 2.11로 사용 가능
JdbcAggregationRepository 를 구성하여 메시지 본문을 저장하고 별도의 열에서 문자열을 문자열로 선택할 수 있습니다. 예를 들어 본문을 저장하고 다음 두 개의 헤더 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>
326.15.1. Codec (Serialization) 링크 복사링크가 클립보드에 복사되었습니다!
모든 유형의 페이로드를 포함할 수 있기 때문에 Exchange는 설계에 의해 직렬화할 수 없습니다. 데이터베이스 BLOB 필드에 저장할 바이트 배열로 변환됩니다. 이러한 모든 변환은 JdbcCodec 클래스에서 처리합니다. 코드의 한 가지 세부 사항은 주의가 필요합니다: ClassLoadingAwareObjectInputStream.
ClassLoadingAwareObjectInputStream 이 Apache ActiveMQ 프로젝트에서 재사용되었습니다. ObjectInputStream 을 래핑하고 현재Thread 가 아닌 ContextClassLoader 와 함께 사용합니다. 이점은 다른 번들에 의해 노출되는 클래스를 로드할 수 있다는 것입니다. 이를 통해 교환 본문 및 헤더에 사용자 지정 유형 오브젝트 참조가 포함될 수 있습니다.
326.15.2. Transaction 링크 복사링크가 클립보드에 복사되었습니다!
Spring PlatformTransactionManager 는 트랜잭션을 오케스트레이션하는 데 필요합니다.
326.15.2.1. 서비스(시작/중지) 링크 복사링크가 클립보드에 복사되었습니다!
start 메서드는 데이터베이스 연결과 필요한 테이블이 있는지 확인합니다. 문제가 발생하면 시작 중에 실패합니다.
326.15.3. 수집기 구성 링크 복사링크가 클립보드에 복사되었습니다!
대상 환경에 따라 수집기에 약간의 구성이 필요할 수 있습니다. 이미 알고 있듯이 각 수집기에는 자체 리포지토리(데이터베이스에 생성된 해당 테이블 쌍 포함)와 데이터 소스가 있어야 합니다. 기본 lobHandler가 데이터베이스 시스템에 적용되지 않으면 lobHandler 속성으로 삽입할 수 있습니다.
다음은 Oracle 선언입니다.
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler">
<property name="nativeJdbcExtractor" ref="nativeJdbcExtractor"/>
</bean>
<bean id="nativeJdbcExtractor"
class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"/>
<bean id="repo"
class="org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository">
<property name="transactionManager" ref="transactionManager"/>
<property name="repositoryName" value="aggregation"/>
<property name="dataSource" ref="dataSource"/>
<!-- Only with Oracle, else use default -->
<property name="lobHandler" ref="lobHandler"/>
</bean>
326.15.4. 최적 잠금 링크 복사링크가 클립보드에 복사되었습니다!
Camel 2.12 이후의 경우 여러 Camel 애플리케이션이 집계 리포지토리에 대해 동일한 데이터베이스를 공유하는 클러스터형 환경에서 이 JDBC 기반 집계 리포지토리를 사용하여 optimisticLocking 을 켜서 사용할 수 있습니다. 경쟁 조건이 있는 경우 JDBC 드라이버는 JdbcAggregationRepository 가 응답할 수 있는 벤더별 예외를 생성합니다. JDBC 드라이버의 예외가 발생한 것을 알려면 이를 위해 mapper가 필요합니다. 따라서 org.apache.camel.processor.aggregate.jdbc.JdbcOptimisticLockingExceptionMapper 가 있으면 필요한 경우 사용자 지정 논리를 구현할 수 있습니다. 기본 구현 org.apache.camel.processor.aggregate.jdbc.DefaultJdbcOptimisticLockingExceptionMapper 는 다음과 같이 작동합니다.
다음 검사가 수행됩니다.
-
발생한 예외가
SQLException인 경우 23으로 시작하는 경우 SQLState가 확인됩니다. -
발생한 예외가
DataIntegrityViolationException인 경우 - 발생한 예외 클래스 이름에 "ConstraintViolation"이 있는 경우
- 클래스 이름이 구성된 경우 FQN 클래스 이름을 선택적으로 확인
또한 FQN 클래스 이름을 추가할 수 있으며 발생한 예외(또는 중첩된)가 FQN 클래스 이름과 동일한 경우 optimistick locking 오류가 발생합니다.
다음은 JDBC 벤더의 2개의 추가 FQN 클래스 이름을 정의하는 예입니다.
<bean id="repo"
class="org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository">
<property name="transactionManager" ref="transactionManager"/>
<property name="repositoryName" value="aggregation"/>
<property name="dataSource" ref="dataSource"/>
<property name="jdbcOptimisticLockingExceptionMapper" ref="myExceptionMapper"/>
</bean>
<!-- use the default mapper with extraFQN class names from our JDBC driver -->
<bean id="myExceptionMapper" class="org.apache.camel.processor.aggregate.jdbc.DefaultJdbcOptimisticLockingExceptionMapper">
<property name="classNames">
<util:set>
<value>com.foo.sql.MyViolationExceptoion</value>
<value>com.foo.sql.MyOtherViolationExceptoion</value>
</util:set>
</property>
</bean>