326.15. 본문 및 헤더를 텍스트로 저장


Camel 2.11로 사용 가능

JdbcAggregationRepository 를 구성하여 메시지 본문을 저장하고 별도의 열에서 문자열을 문자열로 선택할 수 있습니다. 예를 들어 본문을 저장하고 다음 두 개의 헤더 companyNameaccountName 은 다음 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.

ClassLoadingAwareObjectInputStreamApache 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>
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2026 Red Hat
맨 위로 이동