Fuse 6 is no longer supported
As of February 2025, Red Hat Fuse 6 is no longer supported. If you are using Fuse 6, please upgrade to Red Hat build of Apache Camel.第87章 JPA
JPA コンポーネント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
jpa コンポーネントを使用すると、EJB 3 の Java Persistence Architecture (JPA)を使用して永続ストレージから Java オブジェクトを保存および取得できます。JPA は、OpenJPA、Hibernate、TopLink などの Object/Relational Mapping (ORM)製品をラップする標準のインターフェイスレイヤーです。
Camel on EAP デプロイメント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
このコンポーネントは、Red Hat JBoss Enterprise Application Platform (JBoss EAP) コンテナー上で簡素化されたデプロイメントモデルを提供する Camel on EAP (Wildfly Camel) フレームワークによってサポートされます。このモデルの詳細は、Deploying into a Web Server の Apache Camel on JBoss EAP の章を参照してください。
JBoss EAP コンテナーでの JPA コンポーネントの使用に関する詳細は、JPA との統合 を参照してください。
エンドポイントへの送信 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Java エンティティー Bean を JPA プロデューサーエンドポイントに送信すると、Java エンティティー Bean をデータベースに保存できます。In メッセージのボディーは、エンティティー Bean (つまり、@Entity アノテーションを持つ POJO)またはコレクションまたはエンティティー Bean の配列であると想定されます。
ボディーがエンティティーのリストである場合は、
entityType=java.util.ArrayList
をプロデューサーエンドポイントに渡される設定として使用するようにしてください。
ボディーに前述のタイプの 1 つが含まれていない場合は、最初にエンドポイントの前に Message Translator を追加して、最初に必要な変換を実行します。
エンドポイントからの消費 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
JPA コンシューマーエンドポイントからメッセージを消費すると、データベース内のエンティティー Bean が削除される(または更新)されます。これにより、データベーステーブルを論理キューとして使用できます。コンシューマーはキューからメッセージを取得してから、それらを削除/更新してキューから論理的に削除できます。
エンティティー Bean が処理されたときに(ルーティングが完了したら)エンティティー Bean を削除したくない場合は、URI で
consumeDelete=false
を指定できます。これにより、エンティティーはポーリングごとに処理されます。
エンティティーでいくつかの更新を実行して処理済みとしてマークする場合(将来のクエリーから除外するなど)、メソッドに @Consumed のアノテーションを付け、エンティティー Bean の処理時にエンティティー Bean で呼び出されます(ルーティングの完了時)。
Camel 2.13 以降では、
@PreConsumed
を使用できます。これは、(ルーティングの前に)処理される前にエンティティー Bean で呼び出されます。
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
jpa:entityClassName[?options]
jpa:entityClassName[?options]
エンドポイントに送信する場合、Entity ClassName は任意です。指定した場合、Type Converter はボディーが正しいタイプであることを確認するのに役立ちます。
使用するには、EntityClassName は必須です。
URI にクエリーオプションは
?option=value&option=value&.. の形式で追加できます。
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
名前 | デフォルト値 | 説明 |
---|---|---|
entityType
|
entityClassName | URI から entityClassName を上書きします。 |
persistenceUnit
|
camel
|
デフォルトで使用される JPA 永続ユニット。 |
consumeDelete
|
true
|
JPA コンシューマーのみ: true の場合、エンティティーは消費後に削除されます。false の場合、エンティティーは削除されません。
|
consumeLockEntity
|
true
|
JPA consumer only: ポーリングによる結果の処理中に、各エンティティー Bean に排他ロックを設定するかどうかを指定します。 |
flushOnSend
|
true
|
JPA プロデューサーのみ: エンティティー Bean が永続化された後に EntityManager をフラッシュします。 |
maximumResults
|
-1
|
JPA コンシューマーのみ: クエリーで取得する結果の最大数を設定し ます。 |
transactionManager
|
null
|
このオプションはレジストリーベースであり、指定された transactionManager を正しく検索できるように # 表記が必要です(例: transactionManager=#myTransactionManager 使用するトランザクションマネージャーを指定します。指定のない場合、Apache Camel はデフォルトで JpaTransactionManager を使用します。JTA トランザクションマネージャーの設定に使用できます(EJB コンテナーとの統合)。
|
consumer.delay
|
500
|
JPA コンシューマーのみ: 各ポーリング間の遅延(ミリ秒単位)。 |
consumer.initialDelay
|
1000
|
JPA コンシューマーのみ: ポーリングの開始前の Milliseconds。 |
consumer.useFixedDelay
|
false
|
JPA コンシューマーのみ: true に設定すると、ポーリング間の固定遅延が使用されます。それ以外の場合は、固定レートが使用されます。詳細は、JDK の ScheduledExecutorService を参照してください。
|
maxMessagesPerPoll
|
0
|
Apache Camel 2.0:JPA コンシューマーのみ: ポーリングごとに収集するメッセージの最大数を定義する整数値。デフォルトでは最大値は設定されていません。サーバーの起動時に多数のメッセージをポーリングしないようにするために使用できます。無効にするには 0 または負の値を設定します。 |
consumer.query
|
JPA コンシューマーのみ: データを消費するときにカスタムクエリーを使用します。 | |
consumer.namedQuery
|
JPA コンシューマーのみ: データを消費する場合に名前付きクエリーを使用するには、以下を実行します。 | |
consumer.nativeQuery
|
JPA コンシューマーのみ: データを消費するときにカスタムネイティブクエリーを使用するには、以下を実行します。 | |
consumer.parameters
|
Camel 2.12: JPA コンシューマーのみ: クエリーの構築に使用されるパラメーターマップ。パラメーターは Map のインスタンスで、キーは String で、値は Object です。これは一般的なタイプ java.util.Map<String, Object> であることが期待されます。ここで、キーは指定の JPA クエリーの名前付きパラメーターで、値は選択する対応する有効な値です。
|
|
consumer.resultClass
|
Camel 2.7: JPA consumer only: 返されたペイロードのタイプを定義します( entityManager.createNativeQuery (nativeQuery, resultClass) は entityManager.createNativeQuery (nativeQuery) )。このオプションを指定しないと、オブジェクトアレイが返されます。データを消費するときにネイティブクエリーと併用する場合にのみ影響があります。
|
|
consumer.transacted
|
false
|
Camel 2.7.5/2.8.3/2.9: JPA コンシューマーのみ: トランザクションモードでコンシューマーを実行するかどうか。これにより、バッチ全体が処理されたときに、すべてのメッセージがコミットまたはロールバックされます。デフォルトの動作(false)は、以前に処理されたすべてのメッセージをコミットし、最後に失敗したメッセージのみをロールバックすることです。 |
consumer.lockModeType
|
WRITE
|
Camel 2.11.2/2.12: コンシューマーにロックモードを設定するには、以下を行います。使用できる値は enum javax.persistence.LockModeType で定義されます。Camel 2.13 以降、デフォルト値は PESSIMISTIC_WRITE に変更されてい ます。
|
consumer.SkipLockedEntity
|
false
|
Camel 2.13: ロック時に NOWAIT を使用し、エンティティーをサイレントにスキップするかどうかを設定します。
|
usePersist
|
false
|
Camel 2.5: JPA producer only: entityManager.merge (entity) の代わりに entityManager.persist (entity) を使用することを示します。注記: entityManager.persist (entity) は分離されたエンティティーに対して機能しません(EntityManager は INSERT クエリーの代わりに UPDATE を実行する必要があります)。
|
joinTransaction
|
true
|
Camel 2.12.3: camel-jpa は、Camel 2.12 以降からデフォルトでトランザクションに参加します。このオプションを使用してこれをオフにすることができます。たとえば、
LOCAL_RESOURCE を使用し、トランザクションが JPA プロバイダーでは機能しません。このオプションは、すべてのエンドポイントに設定する代わりに、JpaComponent でグローバルに設定することもできます。
|
usePassedInEntityManager
|
false
|
Camel 2.12.4/2.13.1: JPA producer only。
true の場合、Camel はコンポーネント/エンドポイントで設定されたエンティティーマネージャーではなく、ヘッダー JpaConstants.ENTITYMANAGER からの EntityManager を使用します。これにより、エンドユーザーは、使用するエンティティーマネージャーを制御できます。
|
sharedEntityManager
|
false
|
Camel 2.16: コンシューマー/プロデューサーに Spring の
SharedEntityManager を使用するかどうか。エンティティーマネージャーを共有し、トランザクションの組み合わせが適切ではないため、このオプションが true の場合は、joinTransaction=false を設定することが推奨されます。
|
メッセージヘッダー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Apache Camel は以下のメッセージヘッダーをエクスチェンジに追加します。
ヘッダー | タイプ | 説明 |
---|---|---|
CamelEntityManager
|
EntityManager
|
Camel 2.12: JPA consumer / Camel 2.12.2: JPA producer: JpaConsumer または JpaProducer によって使用される JPA EntityManager オブジェクト。 |
EntityManagerFactory の設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
特定の
EntityManagerFactory
インスタンスを使用するように JPA コンポーネントを設定することを強く推奨します。これを行わないと、各 JpaEndpoint
は独自の EntityManagerFactory
インスタンスを自動作成します。たとえば、以下のように myEMFactory
エンティティーマネージャーファクトリーを参照する JPA コンポーネントをインスタンス化できます。
<bean id="jpa" class="org.apache.camel.component.jpa.JpaComponent"> <property name="entityManagerFactory" ref="myEMFactory"/> </bean>
<bean id="jpa" class="org.apache.camel.component.jpa.JpaComponent">
<property name="entityManagerFactory" ref="myEMFactory"/>
</bean>
Camel 2.3 では、
JpaComponent
はレジストリーから EntityManagerFactory
を自動的に検索します。つまり、上記のように JpaComponent
でこれを設定する必要はありません。あいまいさがある場合にのみこれを実行する必要があります。この場合、Camel は WARN をログに記録します。
TransactionManager の設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.3 以降、
JpaComponent
はレジストリーから TransactionManager
を自動的に検索します。Camel が登録された TransactionManager
インスタンスが見つからない場合は、TransactionTemplate
を検索し、そこから TransactionManager
の抽出を試みます。レジストリーで利用可能な TransactionTemplate
がない場合、JpaEndpoint
は TransactionManager
の独自のインスタンスを自動作成します。
TransactionManager
の複数のインスタンスが見つかった場合、Camel は WARN
メッセージをログに記録します。このような場合は、以下のように myTransactionManager
トランザクションマネージャーを参照する JPA コンポーネントをインスタンス化して明示的に設定する必要がある場合があります。
<bean id="jpa" class="org.apache.camel.component.jpa.JpaComponent"> <property name="entityManagerFactory" ref="myEMFactory"/> <property name="transactionManager" ref="myTransactionManager"/> </bean>
<bean id="jpa" class="org.apache.camel.component.jpa.JpaComponent">
<property name="entityManagerFactory" ref="myEMFactory"/>
<property name="transactionManager" ref="myTransactionManager"/>
</bean>
名前付きクエリーでのコンシューマーの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
選択したエンティティーのみを使用する場合は、
consumer.namedQuery
URI クエリーオプションを使用できます。まず、JPA Entity クラスで名前付きクエリーを定義する必要があります。
@Entity @NamedQuery(name = "step1", query = "select x from MultiSteps x where x.step = 1") public class MultiSteps { ... }
@Entity
@NamedQuery(name = "step1", query = "select x from MultiSteps x where x.step = 1")
public class MultiSteps {
...
}
その後、以下のようにコンシューマー URI を定義できます。
from("jpa://org.apache.camel.examples.MultiSteps?consumer.namedQuery=step1") .to("bean:myBusinessLogic");
from("jpa://org.apache.camel.examples.MultiSteps?consumer.namedQuery=step1")
.to("bean:myBusinessLogic");
クエリーでのコンシューマーの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
選択したエンティティーのみを使用する場合は、
consumer.query
URI クエリーオプションを使用できます。クエリーオプションを定義するだけで済みます。
from("jpa://org.apache.camel.examples.MultiSteps?consumer.query=select o from org.apache.camel.examples.MultiSteps o where o.step = 1") .to("bean:myBusinessLogic");
from("jpa://org.apache.camel.examples.MultiSteps?consumer.query=select o from org.apache.camel.examples.MultiSteps o where o.step = 1")
.to("bean:myBusinessLogic");
ネイティブクエリーでのコンシューマーの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
選択したエンティティーのみを使用する場合は、
consumer.nativeQuery
URI クエリーオプションを使用できます。ネイティブクエリーオプションを定義するだけで済みます。
from("jpa://org.apache.camel.examples.MultiSteps?consumer.nativeQuery=select * from MultiSteps where step = 1") .to("bean:myBusinessLogic");
from("jpa://org.apache.camel.examples.MultiSteps?consumer.nativeQuery=select * from MultiSteps where step = 1")
.to("bean:myBusinessLogic");
native クエリーオプションを使用すると、メッセージボディーにオブジェクトアレイを受け取ります。
例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
JPA を使用してトレースされたメッセージをデータベースに保存する例は、トレーサーの例を参照してください。
JPA ベースのべき等リポジトリーの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
このセクションでは、JPA ベースのべき等リポジトリーを使用します。
まず、persistence.xml ファイルで
persistence-unit
を設定する必要があります。
次に、
org.apache.camel.processor.idempotent.jpa.JpaMessageIdRepository
によって使用される org.springframework.orm.jpa.JpaTemplate
を設定する必要があります。
その後、
org.apache.camel.processor.idempotent.jpa.JpaMessageIdRepository
を設定できます。
最後に、Spring XML ファイルで JPA idempotent リポジトリーを作成することもできます。