51.14. JDBC 기반 idempotent 리포지토리 사용


이 섹션에서는 JDBC 기반 idempotent 리포지토리를 사용할 것입니다.

참고

추상 클래스
추상 클래스 org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository 는 사용자 정의 JDBC idempotent 리포지토리를 빌드하도록 확장할 수 있습니다.

먼저 idempotent 리포지토리에서 사용할 데이터베이스 테이블을 만들어야 합니다. 다음 스키마를 사용합니다.

CREATE TABLE CAMEL_MESSAGEPROCESSED ( processorName VARCHAR(255),
messageId VARCHAR(100) )

createdAt 열을 추가했습니다.

CREATE TABLE CAMEL_MESSAGEPROCESSED ( processorName VARCHAR(255),
messageId VARCHAR(100), createdAt TIMESTAMP )
참고

SQL Server TIMESTAMP 유형은 고정 길이의 바이너리 문자열 유형입니다. JDBC 시간 유형, 즉 time ,TIME 또는 TIMESTAMP 에 매핑되지 않습니다.

동시 소비자로 작업할 때는 processorName 및 messageId 열에 대한 고유 제약 조건을 생성하는 것이 중요합니다. 이 제약 조건의 구문이 데이터베이스마다 다르기 때문에 여기에 표시되지 않습니다.Because the syntax for this constraint differs from database to database, we do not show it here.

51.14.1. JDBC idempotency 리포지토리 사용자 정의

필요에 따라 org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository 를 조정할 수 있는 몇 가지 옵션이 있습니다.

Expand
매개변수기본값설명

createTableIfNotExists

true

Camel이 존재하지 않는 경우 테이블을 생성해야 하는지 여부를 정의합니다.

tableName

CAMEL_MESSAGEPROCESSED

기본 이름 대신 사용자 지정 테이블 이름을 사용하려면 CAMEL_MESSAGEPROCESSED.

tableExistsString

SELECT 1 FROM CAMEL_MESSAGEPROCESSED WHERE 1 = 0

이 쿼리는 테이블이 이미 있는지 여부를 확인하는 데 사용됩니다. 테이블이 존재하지 않음을 나타내기 위해 예외를 throw해야 합니다.

createString

CREATEForwarded CAMEL_MESSAGEPROCESSED (processorName VARCHAR(255), messageId VARCHAR(100), createdAt TIMESTAMP)

테이블을 만드는 데 사용되는 명령문입니다.

queryString

SELECT COUNT(*) FROM CAMEL_MESSAGEPROCESSED WHERE processorName = ? 및 messageId = ?

메시지가 리포지토리에 이미 존재하는지 여부를 파악하는 데 사용되는 쿼리입니다(결과가 '0'과 같지 않음). 두 개의 매개 변수가 필요합니다. 첫 번째는 프로세서 이름(문자열)이고, 두 번째는 메시지 ID(문자열)입니다.

insertString

CloudEvent INTO CAMEL_MESSAGEPROCEED (processorName, messageId, createdAt) VALUES (?, ?, ?)

테이블에 항목을 추가하는 데 사용되는 명령문입니다. 세 개의 매개 변수가 필요합니다. 첫 번째는 프로세서 이름(문자열)이고, 두 번째는 메시지 id(문자열)이고, 세 번째는 이 항목이 리포지토리에 추가될 때 타임스탬프(Java.sql.Timestamp)입니다.

deleteString

DELETE FROM CAMEL_MESSAGEPROCESSED WHERE processorName = ? 및 messageId = ?

데이터베이스에서 항목을 삭제하는 데 사용되는 명령문입니다. 두 개의 매개 변수를 사용합니다. 첫 번째는 프로세서 이름(문자열)이고, 두 번째는 메시지 ID(문자열)입니다.

옵션 tableName 은 테이블 이름이 다른 기본 SQL 쿼리를 사용하는 데 사용할 수 있습니다. 그러나 SQL 쿼리를 사용자 지정하려는 경우 각 쿼리를 개별적으로 구성할 수 있습니다.

51.14.2. 고립된 잠금 인식 Jdbc IdempotentRepository

org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository 의 제한 중 하나는 JVM 충돌 또는 정상 종료로 인한 고립 잠금을 처리하지 않는다는 것입니다. 이로 인해 처리되지 않은 파일/이 구현이 camel-file, camel-ftp 등과 함께 사용되는 경우, org.apache.camel.processor.idempotent.jdbc.JdbcOrphanLockAwarepotentRepository 를 사용해야 합니다. 이 리포지토리는 애플리케이션 인스턴스에서 보유하는 잠금을 추적합니다. 보관된 각 잠금에 대해 애플리케이션은 keep signals to the lock repository에 대해 createdAt 열을 현재 Timestamp로 업데이트합니다. 애플리케이션 인스턴스가 잠금을 취득하려고 하면 다음과 같은 세 가지 가능성이 있습니다.

  • lock 항목이 존재하지 않는 경우 JdbcMessageIdRepository 의 기본 구현을 사용하여 잠금이 제공됩니다.
  • 잠금이 이미 존재하며 createdAt < System.currentTimeMillis() - lockMaxAgeMillis. 이 경우 활성 인스턴스에 잠금이 있고 잠금을 요청하는 새 인스턴스에 잠금이 제공되지 않는 것으로 가정합니다.
  • 잠금이 이미 존재하며 createdAt > = System.currentTimeMillis() - lockMaxAgeMillis. 이 경우 잠금이 있고 요청하는 인스턴스에 잠금이 제공되는 활성 인스턴스가 있다고 가정합니다. 그 이유는 잠금이 있는 원래 인스턴스인 경우 아직 실행 중인 경우 keepAlive 메커니즘을 사용하여 createdAt에서 Timestamp를 업데이트했기 때문입니다.

이 리포지토리에는 두 가지 추가 구성 매개변수가 있습니다.

Expand
매개변수설명

lockMaxAgeMillis

이는 잠금이 고립된 것으로 간주되는 기간을 나타냅니다. 즉, currentTimestamp - createdAt >= lockMaxAgeMillis가 분리되는 경우 잠금이 분리됩니다.

lockKeepAliveIntervalMillis

지속적으로 업데이트되는 빈도는At Timestamp 열에 생성됩니다.

51.14.3. Caching Jdbc IdempotentRepository

일부 SQL 구현은 쿼리별로 빠르지 않습니다. JdbcMessageIdRepository 구현은 SQL 트랜잭션 내에서 idempotent를 개별적으로 확인합니다. 간단한 100개의 키를 확인하는 데 몇 분이 걸릴 수 있습니다. JdbcCachedMessageIdRepository 는 전체 키 목록으로 시작 시 메모리 내 캐시를 미리 로드합니다. 그런 다음 이 캐시는 원래 구현으로 통과하기 전에 먼저 확인합니다.

모든 캐시 구현과 마찬가지로 오래된 데이터 및 특정 사용과 관련하여 고려해야 할 고려 사항이 있습니다.

Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

Theme

© 2026 Red Hat
맨 위로 이동