120.15. JDBC ベースのべき等リポジトリーの使用
このセクションでは、JDBC ベースのべき等リポジトリーを使用します。
					抽象クラス 
カスタム JDBC べき等リポジトリーを構築するために拡張できる抽象クラス org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository があります。
				
最初に、べき等リポジトリーで使用されるデータベーステーブルを作成する必要があります。次のスキーマを使用します。
CREATE TABLE CAMEL_MESSAGEPROCESSED ( processorName VARCHAR(255), messageId VARCHAR(100) )
CREATE TABLE CAMEL_MESSAGEPROCESSED ( processorName VARCHAR(255),
messageId VARCHAR(100) )createdAt 列を追加しました。
CREATE TABLE CAMEL_MESSAGEPROCESSED ( processorName VARCHAR(255), messageId VARCHAR(100), createdAt TIMESTAMP )
CREATE TABLE CAMEL_MESSAGEPROCESSED ( processorName VARCHAR(255),
messageId VARCHAR(100), createdAt TIMESTAMP )SQL Server の TIMESTAMP 型は、固定長のバイナリー文字列型です。DATE、TIME、または TIMESTAMP のいずれの JDBC 時刻型にもマップされません。
concurrent consumerと連携する場合、列の processorName と messageId に一意の制約を作成することが重要です。この制約の構文はデータベースによって異なるため、ここでは示しません。
120.15.1. JDBC べき等リポジトリーをカスタマイズする
					必要に応じて org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository を調整するためのいくつかのオプションがあります。
				
| パラメーター | デフォルト値 | 説明 | 
|---|---|---|
| createTableIfNotExists | true | テーブルが存在しない場合、Camel がテーブルを作成しようとするかどうかを定義します。 | 
| tableName | CAMEL_MESSAGEPROCESSED | デフォルト名の代わりにカスタムテーブル名を使用するには: CAMEL_MESSAGEPROCESSED。 | 
| tableExistsString | SELECT 1 FROM CAMEL_MESSAGEPROCESSED WHERE 1 = 0 | このクエリーは、テーブルがすでに存在するかどうかを確認するために使用されます。テーブルが存在しないことを示すには、例外を出力する必要があります。 | 
| createString | CREATE TABLE CAMEL_MESSAGEPROCESSED (processorName VARCHAR(255), messageId VARCHAR(100), createdAt TIMESTAMP) | テーブルの作成に使用されるステートメント。 | 
| queryString | SELECT COUNT(*) FROM CAMEL_MESSAGEPROCESSED WHERE processorName = ?AND messageId = ? | 
									メッセージがリポジトリーにすでに存在するかどうかを判断するために使用されるクエリー (結果は 0 に等しくない)。2 つのパラメーターを取ります。この最初のものはプロセッサー名 ( | 
| insertString | INSERT INTO CAMEL_MESSAGEPROCESSED (processorName, messageId, createdAt) VALUES (?, ?, ?) | 
									エントリーをテーブルに追加するために使用されるステートメント。3 つのパラメーターを取ります。1 つ目はプロセッサー名 ( | 
| deleteString | DELETE FROM CAMEL_MESSAGEPROCESSED WHERE processorName = ?AND messageId = ? | 
									データベースからエントリーを削除するために使用されるステートメント。2 つのパラメーターを取ります。この最初のものはプロセッサー名 ( | 
					オプション tableName を使用すると、デフォルトの SQL クエリーを使用できますが、テーブル名が異なります。ただし、SQL クエリーをカスタマイズする場合は、それぞれを個別に設定できます。
				
120.15.2. Orphan Lock 対応の Jdbc IdempotentRepository
					org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository の制限の 1 つは、JVM クラッシュまたは正常でないシャットダウンに起因する孤立ロックを処理しないことです。この実装が camel-file や camel-ftp などで使用されている場合、未処理のファイル/メッセージが発生する可能性があります。孤立したロック処理に対処する必要がある場合は、org.apache.camel.processor.idempotent.jdbc.JdbcOrphanLockAwareIdempotentRepository を使用してください。このリポジトリーは、アプリケーションのインスタンスが保持するロックを追跡します。保持されているロックごとに、アプリケーションはキープアライブシグナルをロックリポジトリーに送信し、その結果、createdAt 列が現在のタイムスタンプで更新されます。アプリケーションインスタンスがロックを取得しようとする場合、次の 3 つの可能性があります。
				
- 
							ロックエントリーが存在しない場合、ロックは JdbcMessageIdRepositoryの基本実装を使用して提供されます。
- ロックはすでに存在し、createdAt < System.currentTimeMillis () - lockMaxAgeMillis.この場合、アクティブなインスタンスにロックがあり、ロックを要求している新しいインスタンスにロックが提供されていないと想定されます。
- ロックはすでに存在し、createdAt > = System.currentTimeMillis () - lockMaxAgeMillis.この場合、ロックを持つアクティブなインスタンスは存在しないと想定され、ロックは要求側インスタンスに提供されます。背後にある理由は、ロックを持っていた元のインスタンスがまだ実行されていた場合、その keepAlive メカニズムを使用して createdAt のタイムスタンプを更新したためです。
このリポジトリーには、2 つの追加の設定パラメーターがあります。
| パラメーター | 説明 | 
|---|---|
| lockMaxAgeMillis | これは、ロックが孤立したと見なされるまでの期間を指します。つまり、currentTimestamp - createdAt >= lockMaxAgeMillis の場合、ロックは孤立しています。 | 
| lockKeepAliveIntervalMillis | createdAt Timestamp 列に対してキープアライブ更新が行われる頻度。 | 
120.15.3. Jdbc IdempotentRepository のキャッシング
					一部の SQL 実装は、クエリーごとに高速ではありません。JdbcMessageIdRepository 実装は、SQL トランザクション内で個別にべき等チェックを行います。わずか 100 個のキーをチェックするだけでも、数分かかることがあります。JdbcCachedMessageIdRepository は、開始時にキーのリスト全体をメモリー内キャッシュにプリロードします。このキャッシュは、元の実装に渡される前に最初にチェックされます。
				
すべてのキャッシュの実装と同様に、古いデータと特定の使用法に関して考慮すべき事項があります。