326.15. 本文とヘッダーをテキストとして保存する


Camel 2.11 から利用可能

JdbcAggregationRepository を設定して、メッセージ本文と select (ed) ヘッダーを文字列として別々の列に格納できます。たとえば、本文を保存するには、次の 2 つのヘッダー 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. コーデック (シリアル化)

あらゆるタイプのペイロードを含めることができるため、エクスチェンジは設計上シリアライズできません。データベースのブロブフィールドに格納されるバイト配列に変換されます。これらの変換はすべて JdbcCodec クラスによって処理されます。コードの 1 つの詳細に注意する必要があります: ClassLoadingAwareObjectInputStream です。

ClassLoadingAwareObjectInputStream は、Apache ActiveMQ プロジェクトから再利用されています。ObjectInputStream をラップし、currentThread ではなく ContextClassLoader で使用します。利点は、他のバンドルによって公開されたクラスをロードできることです。これにより、交換の本文とヘッダーにカスタム型のオブジェクト参照を含めることができます。

326.15.2. Transaction

トランザクションを調整するには、Spring PlatformTransactionManager が必要です。

326.15.2.1. Service (Start/Stop)

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. Optimistic locking

Camel 2.12 以降では、optimisticLocking をオンにして、複数の Camel アプリケーションが集約リポジトリー用の同じデータベースを共有するクラスター化された環境で、この JDBC ベースの集約リポジトリーを使用できます。競合状態がある場合、JDBC ドライバーは、JdbcAggregationRepository が対応できるベンダー固有の例外を出力します。JDBC ドライバーからの例外の原因が楽観的ロックエラーと見なされるかを知るには、これを行うマッパーが必要です。したがって、org.apache.camel.processor.aggregate.jdbc.JdbcOptimisticLockingExceptionMapper があり、必要に応じてカスタムロジックを実装できます。次のように動作するデフォルトの実装 org.apache.camel.processor.aggregate.jdbc.DefaultJdbcOptimisticLockingExceptionMapper があります。

次のチェックが行われます。

  • 原因となった例外が SQLException の場合、SQLState が 23 で始まるかどうかがチェックされます。
  • 原因となった例外が DataIntegrityViolationException の場合
  • 発生した例外クラス名に ConstraintViolation が含まれる場合。
  • クラス名が設定されている場合、FQN クラス名の一致をオプションでチェックします

さらに、FQN クラス名を追加できます。発生した例外 (またはネストされた例外) のいずれかが FQN クラス名のいずれかと等しい場合は、楽観的ロックエラーになります。

以下は、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 では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.