본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

Azure CosmosDB

원문 보기 위키 갱신

Azure CosmosDB (camel-azure-cosmosdb)

Azure CosmosDB 컴포넌트는 Microsoft의 글로벌 분산 멀티모델 데이터베이스 서비스인 Azure Cosmos DB를 Azure SQL API를 통해 다루는 컴포넌트예요. 프로듀서로는 데이터베이스·컨테이너 관리부터 아이템 CRUD, SQL 쿼리까지 폭넓은 연산을 제공하고, 컨슈머로는 ChangeFeed 패턴으로 변경 피드를 비동기로 받아 봐요. 이 문서에서는 URI 형식, 컴포넌트·엔드포인트 옵션, 메시지 헤더, 프로듀서 연산과 예제까지 차례로 살펴봐요.

출처: 문서

본문

Camel 3.10부터 지원

컨슈머와 프로듀서를 모두 지원해요

Azure Cosmos DB는 운영과 분석 워크로드를 위한 Microsoft의 글로벌 분산 멀티모델 데이터베이스 서비스예요. 처리량, 컴퓨트, 스토리지를 자동으로 확장해 주는 멀티 마스터(multi-mastering) 기능을 제공해요. 이 컴포넌트는 Azure SQL API를 통해 Azure CosmosDB와 상호작용해요.

사전 준비 사항 (Prerequisites)

유효한 Windows Azure Storage 계정이 있어야 해요. 자세한 정보는 Azure Documentation Portal에서 확인할 수 있어요.

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-azure-cosmosdb</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

URI 형식 (URI Format)

azure-cosmosdb://[databaseName][/containerName][?options]

컨슈머의 경우 databaseName, containerName이 필수예요. 프로듀서의 경우에는 요청하는 연산에 따라 달라져요. 예를 들어 연산이 데이터베이스 수준(deleteDatabase 같은)이면 databaseName만 필요하고, 연산이 컨테이너 수준(readItem 같은)이면 databaseName과 containerName이 모두 필요해요.

쿼리 옵션은 다음 형식으로 URI에 덧붙일 수 있어요, ?options=value&option2=value&…​

옵션 설정 (Configuring Options)

Camel 컴포넌트는 두 가지 수준에서 설정해요:

  • 컴포넌트 수준

  • 엔드포인트 수준

컴포넌트 옵션 설정 (Configuring Component Options)

컴포넌트 수준에서는 엔드포인트들이 물려받는 일반적이고 공유되는 설정을 다뤄요. 가장 높은 설정 수준이죠.

예를 들어 컴포넌트에는 보안 설정, 인증용 자격 증명, 네트워크 연결 URL 같은 것들이 있을 수 있어요.

옵션이 몇 개뿐인 컴포넌트도 있고, 많은 컴포넌트도 있어요. 컴포넌트에는 보통 널리 쓰이는 기본값이 미리 설정되어 있어서, 컴포넌트에 설정할 옵션이 몇 개뿐이거나 아예 없는 경우가 많아요.

컴포넌트는 다음 방법으로 설정할 수 있어요:

  • Component DSL

  • 설정 파일(application.properties, *.yaml 파일 등)

  • Java 코드에서 직접

엔드포인트 옵션 설정 (Configuring Endpoint Options)

엔드포인트는 옵션이 많아서 설정에 시간을 더 쓰게 되는 편이에요. 이 옵션들이 엔드포인트가 무엇을 할지 원하는 대로 꾸며 줘요. 옵션은 엔드포인트가 컨슈머(from)로 쓰이는지, 프로듀서(to)로 쓰이는지, 둘 다인지에 따라 분류되기도 해요.

엔드포인트 설정은 대개 엔드포인트 URI에 _path_와 query 파라미터로 바로 하는 편이에요. Java에서 엔드포인트와 데이터 포맷을 _타입 세이프(type safe)_하게 설정하고 싶다면 Endpoint DSL과 DataFormat DSL을 쓸 수도 있어요.

옵션을 설정할 때 좋은 습관은 Property Placeholders를 활용하는 거예요.

프로퍼티 플레이스홀더는 몇 가지 이점이 있어요:

  • 하드코딩된 URL, 포트 번호, 민감한 정보, 기타 설정을 쓰지 않도록 도와줘요.

  • 설정을 코드 밖으로 꺼내 외부화할 수 있게 해 줘요.

  • 코드가 더 유연하고 재사용하기 좋아지게 만들어 줘요.

다음 두 섹션에 모든 옵션이 나열돼요. 먼저 컴포넌트 옵션, 그다음이 엔드포인트 옵션이에요.

컴포넌트 옵션 (Component Options)

Azure CosmosDB 컴포넌트는 아래 나열된 옵션들을 지원해요.

Name Description Default Type
clientTelemetryEnabled (common) 클라이언트 텔레메트리를 활성화하는 플래그를 설정해요. 활성화하면 데이터베이스 연산 집계 통계와 cpu/메모리 같은 시스템 정보를 주기적으로 수집해 코스모스 모니터링 서비스로 보내서, 디버깅할 때 도움을 받을 수 있어요. 기본값은 false로, 옵트인(opt-in) 기능이라 기본적으로는 텔레메트리를 수집하지 않아요. false boolean
configuration (common) 컴포넌트 설정이에요. CosmosDbConfiguration
connectionSharingAcrossClientsEnabled (common) 여러 Cosmos Client에 걸쳐 연결을 공유할 수 있게 해 줘요. 기본값은 false예요. 같은 JVM에서 여러 Cosmos Client 인스턴스가 여러 Cosmos 계정과 통신하는 상황에서 이 옵션을 켜면, 가능한 경우 Direct 모드에서 클라이언트 인스턴스 간 연결 공유가 일어나요. 이 옵션을 설정하면 처음 만들어진 클라이언트의 연결 설정(예: 소켓 타임아웃 설정, 유휴 타임아웃 설정)이 다른 모든 클라이언트 인스턴스에도 적용된다는 점에 유의하세요. false boolean
consistencyLevel (common)
Azure Cosmos DB 서비스에서 클라이언트 연산에 지원되는 일관성 수준(consistency level)을 설정해요. 요청한 ConsistencyLevel은 데이터베이스 계정에 프로비저닝된 수준과 같거나 더 약해야 해요. 강도 순서로는 STRONG, BOUNDED_STALENESS, SESSION, EVENTUAL이에요. 자세한 내용은 일관성 수준 문서를 참고하세요: https://docs.microsoft.com/en-us/azure/cosmos-db/consistency-levels.

Enum values:

  • Strong

  • BoundedStaleness

  • Session

  • Eventual

  • ConsistentPrefix

| SESSION | ConsistencyLevel | | containerPartitionKeyPath (common) | 컨테이너 파티션 키 경로를 설정해요. | | String | | contentResponseOnWriteEnabled (common) | CosmosItem에 대한 Create, Update, Delete 연산 시 Cosmos DB 응답에서 헤더와 상태 코드만 돌려 받도록 설정하는 불리언이에요. 컨슈머에서는 이 플래그가 켜져 있어야 하는 ChangeFeed가 있기 때문에 기본으로 활성화되어 있어서 재정의하면 안 돼요. 프로듀서에서는 네트워크 오버헤드를 줄여 주기 때문에 끄는 게 좋아요. | true | boolean | | cosmosAsyncClient (common) | Autowired Azure Cosmos DB 서비스의 클라이언트 측 논리 표현을 제공하는 외부 CosmosAsyncClient를 컴포넌트에 주입해요. 이 비동기 클라이언트로 서비스에 대한 요청을 설정하고 실행해요. | | CosmosAsyncClient | | createContainerIfNotExists (common) | Cosmos 데이터베이스에 컨테이너가 없는 경우 컴포넌트가 자동으로 만들도록 설정해요. | false | boolean | | createDatabaseIfNotExists (common) | Cosmos 계정에 데이터베이스가 없는 경우 컴포넌트가 자동으로 만들도록 설정해요. | false | boolean | | databaseEndpoint (common) | 필수 컴포넌트가 연결할 Azure Cosmos 데이터베이스 엔드포인트를 설정해요. | | String | | multipleWriteRegionsEnabled (common) | Azure Cosmos DB 서비스에서 지역 복제(geo-replicated)된 데이터베이스 계정에 대해 어느 리전에서든 쓰기를 허용하는 플래그를 설정해요. 이 프로퍼티가 true면 SDK는 지역 복제된 계정의 쓰기 가능 리전으로 쓰기 연산을 보내요. 쓰기 가능 리전은 PreferredRegions 프로퍼티 순서를 따라요. DatabaseAccount의 EnableMultipleWriteRegions도 true로 설정되기 전까지는 이 값을 true로 해도 효과가 없어요. 기본값은 true로, 지역 복제된 계정의 쓰기 가능 리전으로 쓰기가 보내진다는 뜻이에요. | true | boolean | | preferredRegions (common) | 지역 복제된 데이터베이스 계정을 위해 콤마로 구분된 선호 리전(preferred regions)을 설정해요. 예를 들어 East US를 선호 리전으로 지정하는 식이에요. EnableEndpointDiscovery가 true이고 PreferredRegions가 비어 있지 않으면, SDK는 지정된 순서대로 컨테이너의 리전을 선호해서 연산을 수행해요. | | String | | readRequestsFallbackEnabled (common) | Azure Cosmos DB 서비스 계정에 설정된 여러 리전으로 읽기가 넘어가는 것(fallback)을 허용할지 설정해요. 기본값은 true예요. 이 프로퍼티를 설정하지 않으면 Bounded Staleness를 제외한 모든 일관성 수준에서 기본은 true, Bounded Staleness에서는 false예요. 1. endpointDiscoveryEnabled가 true 2. Azure Cosmos DB 계정에 리전이 둘 이상이어야 해요. | true | boolean | | throughputProperties (common) | Azure Cosmos DB 서비스에서 리소스의 처리량(throughput)을 설정해요. | | ThroughputProperties | | bridgeErrorHandler (consumer) | 컨슈머를 Camel 라우팅 에러 핸들러(Error Handler)에 브리지할 수 있게 해 줘요. 즉, Camel 컨슈머가 들어오는 메시지를 집어 올리는 동안 등에서 예외가 발생하면(가능한 경우), 그 예외를 메시지로 처리해서 라우팅 에러 핸들러가 다루게 돼요. 중요: 이것은 서드파티 컴포넌트가 예외가 던져졌을 때 Camel에 알릴 수 있도록 허용하는 경우에만 가능해요. 일부 컴포넌트는 내부에서만 처리하기 때문에 bridgeErrorHandler를 쓸 수 없어요. 다른 상황에서는 Camel 컴포넌트를 개선해서 서드파티 컴포넌트에 연결(hook)해 이를 가능하게 만들 수도 있어요. 기본으로 컨슈머는 org.apache.camel.spi.ExceptionHandler로 예외를 처리하는데, WARN 또는 ERROR 레벨로 로그를 남기고 무시해요. | false | boolean | | changeFeedProcessorOptions (consumer) | 사용할 ChangeFeedProcessorOptions를 설정해요. 따로 설정하지 않으면 기본값은 다음과 같아요: 페이지(FeedResponse)당 최대 아이템 수: 100, 리스(lease) 갱신 간격: 17초, 리스 획득 간격: 13초, 리스 만료 간격: 60초, 피드 폴링 지연: 5초, 최대 스케일 개수: 무제한. | | ChangeFeedProcessorOptions | | createLeaseContainerIfNotExists (consumer) | Cosmos 데이터베이스에 컨슈머용 리스(lease) 컨테이너가 없는 경우 컴포넌트가 자동으로 만들도록 설정해요. | false | boolean | | createLeaseDatabaseIfNotExists (consumer) | Cosmos 계정에 컨슈머용 리스 데이터베이스가 없는 경우 컴포넌트가 자동으로 만들도록 설정해요. | false | boolean | | hostName (consumer) | 호스트명을 설정해요. 호스트(host)란 change feed processor를 써서 변경 사항을 리스닝하는 애플리케이션 인스턴스예요. 같은 리스 설정으로 여러 인스턴스가 병렬로 실행될 수 있지만, 각 인스턴스는 서로 다른 인스턴스 이름을 가져야 해요. 지정하지 않으면 무작위 호스트명이 생성돼요. | | String | | leaseContainerName (consumer) | 상태 저장소 역할을 하며 여러 워커에 걸쳐 change feed 처리를 조정하는 리스 컨테이너를 설정해요. 리스 컨테이너는 모니터링 대상 컨테이너와 같은 계정에 둘 수도 있고 별도 계정에 둘 수도 있어요. createLeaseContainerIfNotExists가 true면 자동으로 생성돼요. | camel-lease | String | | leaseDatabaseName (consumer) | leaseContainerName이 저장될 리스 데이터베이스를 설정해요. 지정하지 않으면 이 컴포넌트는 databaseName에 지정된 것과 같은 데이터베이스에 리스 컨테이너를 저장해요. createLeaseDatabaseIfNotExists가 true면 자동으로 생성돼요. | | String | | itemId (producer) | delete, replace 같은 아이템 연산에 필요한 경우 itemId를 설정해요. | | String | | itemPartitionKey (producer) | 파티션 키를 설정해요. Azure Cosmos DB 데이터베이스 서비스에서 파티션 키 값을 나타내요. 파티션 키는 아이템이 저장되는 파티션을 식별해요. | | String | | lazyStartProducer (producer) | 프로듀서를 느리게(lazy, 첫 메시지가 올 때) 시작할지 여부예요. 느리게 시작하면, 프로듀서가 시작 중에 실패해서 라우트 시작 자체가 실패하는 상황에서도 CamelContext와 라우트를 시작할 수 있어요. 시작을 늦춰 두면 실패가 발생했을 때 메시지를 라우팅하는 동안 Camel의 라우팅 에러 핸들러로 처리할 수 있죠. 단, 첫 메시지를 처리할 때 프로듀서를 만들고 시작하는 데 시간이 조금 걸려서 전체 처리 시간이 길어질 수 있다는 점은 감안하세요. | false | boolean | | operation (producer) |

프로듀서에서 이 컴포넌트와 함께 쓸 수 있는 CosmosDB 연산이에요.

Enum values:

  • listDatabases

  • createDatabase

  • queryDatabases

  • deleteDatabase

  • createContainer

  • replaceDatabaseThroughput

  • listContainers

  • queryContainers

  • deleteContainer

  • replaceContainerThroughput

  • createItem

  • upsertItem

  • deleteItem

  • replaceItem

  • readItem

  • readAllItems

  • queryItems

| listDatabases | CosmosDbOperationsDefinition | | query (producer) | 주어진 리소스에 실행할 SQL 쿼리예요. Cosmos SQL API에 대해 더 알아보려면 이 링크를 확인하세요 \{link https://docs.microsoft.com/en-us/azure/cosmos-db/sql-query-getting-started}. | | String | | queryRequestOptions (producer) | queryItems, queryContainers, queryDatabases, listDatabases, listItems, listContainers 연산에 쓸 수 있는 추가 QueryRequestOptions를 설정해요. | | CosmosQueryRequestOptions | | indexingPolicy ( advanced) | 컨테이너 생성 시 설정될 CosmosDB 인덱싱 정책(Indexing Policy)이에요. createLeaseContainerIfNotExists와 관련된 옵션이고, 그 값이 true일 때 반영돼요. | | IndexingPolicy | | autowiredEnabled (advanced) | 자동 와이어링(autowiring)을 활성화할지 여부예요. 레지스트리에서 해당 타입의 인스턴스가 하나뿐인지 찾아서, autowired로 표시된 옵션을 자동으로 연결하는 데 쓰여요. JDBC 데이터 소스, JMS 커넥션 팩토리, AWS 클라이언트 등을 자동 설정하는 데 활용할 수 있어요. | true | boolean | | accountKey (security) | 리소스 접근 인증에 쓰이는 마스터 키 또는 읽기 전용 키를 설정해요. | | String | | credentialType (security) |

채택할 자격 증명 전략을 결정해요.

Enum values:

  • SHARED_ACCOUNT_KEY

  • AZURE_IDENTITY

| SHARED_ACCOUNT_KEY | CredentialType |

엔드포인트 옵션 (Endpoint Options)

Azure CosmosDB 엔드포인트는 다음 URI 구문으로 설정해요:

azure-cosmosdb:databaseName/containerName

다음 _path_와 query 파라미터를 사용해요:

경로 파라미터 (Path Parameters)

Name Description Default Type
databaseName (common) 컴포넌트가 연결할 Cosmos 데이터베이스의 이름이에요. 데이터를 프로듀싱하면서 createDatabaseIfNotExists=true로 두면 컴포넌트가 Cosmos 데이터베이스를 자동으로 만들어 줘요. String
containerName (common) 컴포넌트가 연결할 Cosmos 컨테이너의 이름이에요. 데이터를 프로듀싱하면서 createContainerIfNotExists=true로 두면 컴포넌트가 Cosmos 컨테이너를 자동으로 만들어 줘요. String

쿼리 파라미터 (Query Parameters)

Name Description Default Type
clientTelemetryEnabled (common) 클라이언트 텔레메트리를 활성화하는 플래그를 설정해요. 활성화하면 데이터베이스 연산 집계 통계와 cpu/메모리 같은 시스템 정보를 주기적으로 수집해 코스모스 모니터링 서비스로 보내서, 디버깅할 때 도움을 받을 수 있어요. 기본값은 false로, 옵트인(opt-in) 기능이라 기본적으로는 텔레메트리를 수집하지 않아요. false boolean
connectionSharingAcrossClientsEnabled (common) 여러 Cosmos Client에 걸쳐 연결을 공유할 수 있게 해 줘요. 기본값은 false예요. 같은 JVM에서 여러 Cosmos Client 인스턴스가 여러 Cosmos 계정과 통신하는 상황에서 이 옵션을 켜면, 가능한 경우 Direct 모드에서 클라이언트 인스턴스 간 연결 공유가 일어나요. 이 옵션을 설정하면 처음 만들어진 클라이언트의 연결 설정(예: 소켓 타임아웃 설정, 유휴 타임아웃 설정)이 다른 모든 클라이언트 인스턴스에도 적용된다는 점에 유의하세요. false boolean
consistencyLevel (common)
Azure Cosmos DB 서비스에서 클라이언트 연산에 지원되는 일관성 수준(consistency level)을 설정해요. 요청한 ConsistencyLevel은 데이터베이스 계정에 프로비저닝된 수준과 같거나 더 약해야 해요. 강도 순서로는 STRONG, BOUNDED_STALENESS, SESSION, EVENTUAL이에요. 자세한 내용은 일관성 수준 문서를 참고하세요: https://docs.microsoft.com/en-us/azure/cosmos-db/consistency-levels.

Enum values:

  • Strong

  • BoundedStaleness

  • Session

  • Eventual

  • ConsistentPrefix

| SESSION | ConsistencyLevel | | containerPartitionKeyPath (common) | 컨테이너 파티션 키 경로를 설정해요. | | String | | contentResponseOnWriteEnabled (common) | CosmosItem에 대한 Create, Update, Delete 연산 시 Cosmos DB 응답에서 헤더와 상태 코드만 돌려 받도록 설정하는 불리언이에요. 컨슈머에서는 이 플래그가 켜져 있어야 하는 ChangeFeed가 있기 때문에 기본으로 활성화되어 있어서 재정의하면 안 돼요. 프로듀서에서는 네트워크 오버헤드를 줄여 주기 때문에 끄는 게 좋아요. | true | boolean | | cosmosAsyncClient (common) | Autowired Azure Cosmos DB 서비스의 클라이언트 측 논리 표현을 제공하는 외부 CosmosAsyncClient를 컴포넌트에 주입해요. 이 비동기 클라이언트로 서비스에 대한 요청을 설정하고 실행해요. | | CosmosAsyncClient | | createContainerIfNotExists (common) | Cosmos 데이터베이스에 컨테이너가 없는 경우 컴포넌트가 자동으로 만들도록 설정해요. | false | boolean | | createDatabaseIfNotExists (common) | Cosmos 계정에 데이터베이스가 없는 경우 컴포넌트가 자동으로 만들도록 설정해요. | false | boolean | | databaseEndpoint (common) | 필수 컴포넌트가 연결할 Azure Cosmos 데이터베이스 엔드포인트를 설정해요. | | String | | multipleWriteRegionsEnabled (common) | Azure Cosmos DB 서비스에서 지역 복제(geo-replicated)된 데이터베이스 계정에 대해 어느 리전에서든 쓰기를 허용하는 플래그를 설정해요. 이 프로퍼티가 true면 SDK는 지역 복제된 계정의 쓰기 가능 리전으로 쓰기 연산을 보내요. 쓰기 가능 리전은 PreferredRegions 프로퍼티 순서를 따라요. DatabaseAccount의 EnableMultipleWriteRegions도 true로 설정되기 전까지는 이 값을 true로 해도 효과가 없어요. 기본값은 true로, 지역 복제된 계정의 쓰기 가능 리전으로 쓰기가 보내진다는 뜻이에요. | true | boolean | | preferredRegions (common) | 지역 복제된 데이터베이스 계정을 위해 콤마로 구분된 선호 리전(preferred regions)을 설정해요. 예를 들어 East US를 선호 리전으로 지정하는 식이에요. EnableEndpointDiscovery가 true이고 PreferredRegions가 비어 있지 않으면, SDK는 지정된 순서대로 컨테이너의 리전을 선호해서 연산을 수행해요. | | String | | readRequestsFallbackEnabled (common) | Azure Cosmos DB 서비스 계정에 설정된 여러 리전으로 읽기가 넘어가는 것(fallback)을 허용할지 설정해요. 기본값은 true예요. 이 프로퍼티를 설정하지 않으면 Bounded Staleness를 제외한 모든 일관성 수준에서 기본은 true, Bounded Staleness에서는 false예요. 1. endpointDiscoveryEnabled가 true 2. Azure Cosmos DB 계정에 리전이 둘 이상이어야 해요. | true | boolean | | throughputProperties (common) | Azure Cosmos DB 서비스에서 리소스의 처리량(throughput)을 설정해요. | | ThroughputProperties | | changeFeedProcessorOptions (consumer) | 사용할 ChangeFeedProcessorOptions를 설정해요. 따로 설정하지 않으면 기본값은 다음과 같아요: 페이지(FeedResponse)당 최대 아이템 수: 100, 리스(lease) 갱신 간격: 17초, 리스 획득 간격: 13초, 리스 만료 간격: 60초, 피드 폴링 지연: 5초, 최대 스케일 개수: 무제한. | | ChangeFeedProcessorOptions | | createLeaseContainerIfNotExists (consumer) | Cosmos 데이터베이스에 컨슈머용 리스(lease) 컨테이너가 없는 경우 컴포넌트가 자동으로 만들도록 설정해요. | false | boolean | | createLeaseDatabaseIfNotExists (consumer) | Cosmos 계정에 컨슈머용 리스 데이터베이스가 없는 경우 컴포넌트가 자동으로 만들도록 설정해요. | false | boolean | | hostName (consumer) | 호스트명을 설정해요. 호스트(host)란 change feed processor를 써서 변경 사항을 리스닝하는 애플리케이션 인스턴스예요. 같은 리스 설정으로 여러 인스턴스가 병렬로 실행될 수 있지만, 각 인스턴스는 서로 다른 인스턴스 이름을 가져야 해요. 지정하지 않으면 무작위 호스트명이 생성돼요. | | String | | leaseContainerName (consumer) | 상태 저장소 역할을 하며 여러 워커에 걸쳐 change feed 처리를 조정하는 리스 컨테이너를 설정해요. 리스 컨테이너는 모니터링 대상 컨테이너와 같은 계정에 둘 수도 있고 별도 계정에 둘 수도 있어요. createLeaseContainerIfNotExists가 true면 자동으로 생성돼요. | camel-lease | String | | leaseDatabaseName (consumer) | leaseContainerName이 저장될 리스 데이터베이스를 설정해요. 지정하지 않으면 이 컴포넌트는 databaseName에 지정된 것과 같은 데이터베이스에 리스 컨테이너를 저장해요. createLeaseDatabaseIfNotExists가 true면 자동으로 생성돼요. | | String | | bridgeErrorHandler (consumer (advanced)) | 컨슈머를 Camel 라우팅 에러 핸들러(Error Handler)에 브리지할 수 있게 해 줘요. 즉, Camel 컨슈머가 들어오는 메시지를 집어 올리는 동안 등에서 예외가 발생하면(가능한 경우), 그 예외를 메시지로 처리해서 라우팅 에러 핸들러가 다루게 돼요. 중요: 이것은 서드파티 컴포넌트가 예외가 던져졌을 때 Camel에 알릴 수 있도록 허용하는 경우에만 가능해요. 일부 컴포넌트는 내부에서만 처리하기 때문에 bridgeErrorHandler를 쓸 수 없어요. 다른 상황에서는 Camel 컴포넌트를 개선해서 서드파티 컴포넌트에 연결(hook)해 이를 가능하게 만들 수도 있어요. 기본으로 컨슈머는 org.apache.camel.spi.ExceptionHandler로 예외를 처리하는데, WARN 또는 ERROR 레벨로 로그를 남기고 무시해요. | false | boolean | | exceptionHandler (consumer (advanced)) | 컨슈머가 커스텀 ExceptionHandler를 쓰게 할 수 있어요. bridgeErrorHandler 옵션이 활성화되어 있으면 이 옵션은 사용되지 않는다는 점에 주의하세요. 기본으로 컨슈머는 예외를 처리하는데, WARN 또는 ERROR 레벨로 로그를 남기고 무시해요. | | ExceptionHandler | | exchangePattern (consumer (advanced)) |

컨슈머가 교환(exchange)을 만들 때 교환 패턴을 설정해요.

Enum values:

  • InOnly

  • InOut

| | ExchangePattern | | itemId (producer) | delete, replace 같은 아이템 연산에 필요한 경우 itemId를 설정해요. | | String | | itemPartitionKey (producer) | 파티션 키를 설정해요. Azure Cosmos DB 데이터베이스 서비스에서 파티션 키 값을 나타내요. 파티션 키는 아이템이 저장되는 파티션을 식별해요. | | String | | operation (producer) |

프로듀서에서 이 컴포넌트와 함께 쓸 수 있는 CosmosDB 연산이에요.

Enum values:

  • listDatabases

  • createDatabase

  • queryDatabases

  • deleteDatabase

  • createContainer

  • replaceDatabaseThroughput

  • listContainers

  • queryContainers

  • deleteContainer

  • replaceContainerThroughput

  • createItem

  • upsertItem

  • deleteItem

  • replaceItem

  • readItem

  • readAllItems

  • queryItems

| listDatabases | CosmosDbOperationsDefinition | | query (producer) | 주어진 리소스에 실행할 SQL 쿼리예요. Cosmos SQL API에 대해 더 알아보려면 이 링크를 확인하세요 \{link https://docs.microsoft.com/en-us/azure/cosmos-db/sql-query-getting-started}. | | String | | queryRequestOptions (producer) | queryItems, queryContainers, queryDatabases, listDatabases, listItems, listContainers 연산에 쓸 수 있는 추가 QueryRequestOptions를 설정해요. | | CosmosQueryRequestOptions | | lazyStartProducer (producer (advanced)) | 프로듀서를 느리게(lazy, 첫 메시지가 올 때) 시작할지 여부예요. 느리게 시작하면, 프로듀서가 시작 중에 실패해서 라우트 시작 자체가 실패하는 상황에서도 CamelContext와 라우트를 시작할 수 있어요. 시작을 늦춰 두면 실패가 발생했을 때 메시지를 라우팅하는 동안 Camel의 라우팅 에러 핸들러로 처리할 수 있죠. 단, 첫 메시지를 처리할 때 프로듀서를 만들고 시작하는 데 시간이 조금 걸려서 전체 처리 시간이 길어질 수 있다는 점은 감안하세요. | false | boolean | | indexingPolicy ( advanced) | 컨테이너 생성 시 설정될 CosmosDB 인덱싱 정책(Indexing Policy)이에요. createLeaseContainerIfNotExists와 관련된 옵션이고, 그 값이 true일 때 반영돼요. | | IndexingPolicy | | accountKey (security) | 리소스 접근 인증에 쓰이는 마스터 키 또는 읽기 전용 키를 설정해요. | | String | | credentialType (security) |

채택할 자격 증명 전략을 결정해요.

Enum values:

  • SHARED_ACCOUNT_KEY

  • AZURE_IDENTITY

| SHARED_ACCOUNT_KEY | CredentialType |

사용법 (Usage)

인증 정보 (Authentication Information)

이 컴포넌트를 쓰려면 필요한 Azure 인증 정보를 제공하는 방법이 두 가지 있어요:

  • Azure CosmosDB 계정의 accountKey와 databaseEndpoint를 제공해요. 계정 키는 CosmosDB Azure 포털에서 생성할 수 있어요.

  • cosmosAsyncClient에 넣어 줄 수 있는 CosmosAsyncClient 인스턴스를 제공해요.

비동기 컨슈머와 프로듀서 (Async Consumer and Producer)

이 컴포넌트는 비동기(Async) 컨슈머와 프로듀서를 구현해요.

덕분에 Camel 라우트가 스레드를 블로킹하지 않고도 이벤트를 비동기로 소비하고 생산할 수 있어요.

컴포넌트 프로듀서가 평가하는 메시지 헤더 (Message headers evaluated by the component producer)

Header Variable Name Type Description
CamelAzureCosmosDbDatabaseName CosmosDbConstants.DATABASE_NAME String 컴포넌트가 연결할 Cosmos 데이터베이스의 이름인 데이터베이스 이름을 재정의해요. 데이터를 프로듀싱하면서 createDatabaseIfNotExists=true로 두면 컴포넌트가 Cosmos 데이터베이스를 자동으로 만들어 줘요.
CamelAzureCosmosDbContainerName CosmosDbConstants.CONTAINER_NAME String 컴포넌트가 연결할 Cosmos 컨테이너의 이름인 컨테이너 이름을 재정의해요. 데이터를 프로듀싱하면서 createContainerIfNotExists=true로 두면 컴포넌트가 Cosmos 컨테이너를 자동으로 만들어 줘요.
CamelAzureCosmosDbOperation CosmosDbConstants.OPERATION CosmosDbOperationsDefinition 프로듀서에서 특정 연산을 실행할 때 쓰이는 프로듀서 연산을 설정해요.
CamelAzureCosmosDbQuery CosmosDbConstants.QUERY String 주어진 프로듀서 쿼리 연산에서 실행할 SQL 쿼리를 설정해요.
CamelAzureCosmosDbQueryRequestOptions CosmosDbConstants.QUERY_REQUEST_OPTIONS CosmosQueryRequestOptions queryItems, queryContainers, queryDatabases, listDatabases, listItems, listContainers 연산에 쓸 수 있는 추가 QueryRequestOptions를 설정해요.
CamelAzureCosmosDbCreateDatabaseIfNotExist CosmosDbConstants.CREATE_DATABASE_IF_NOT_EXIST boolean Cosmos 계정에 데이터베이스가 없는 경우 컴포넌트가 자동으로 만들도록 설정해요.
CamelAzureCosmosDbCreateContainerIfNotExist CosmosDbConstants.CREATE_CONTAINER_IF_NOT_EXIST boolean Cosmos 계정에 컨테이너가 없는 경우 컴포넌트가 자동으로 만들도록 설정해요.
CamelAzureCosmosDbThroughputProperties CosmosDbConstants.THROUGHPUT_PROPERTIES ThroughputProperties Azure Cosmos DB 서비스에서 리소스의 처리량을 설정해요.
CamelAzureCosmosDbDatabaseRequestOptions CosmosDbConstants.DATABASE_REQUEST_OPTIONS CosmosDatabaseRequestOptions 데이터베이스 연산에서 실행할 추가 옵션을 설정해요.
CamelAzureCosmosDbContainerPartitionKeyPath CosmosDbConstants.CONTAINER_PARTITION_KEY_PATH String 컨테이너 파티션 키 경로를 설정해요.
CamelAzureCosmosDbContainerRequestOptions CosmosDbConstants.CONTAINER_REQUEST_OPTIONS CosmosContainerRequestOptions 컨테이너 연산에서 실행할 추가 옵션을 설정해요.
CamelAzureCosmosDbItemPartitionKey CosmosDbConstants.ITEM_PARTITION_KEY String 파티션 키를 설정해요. Azure Cosmos DB 데이터베이스 서비스에서 파티션 키 값을 나타내요. 파티션 키는 아이템이 저장되는 파티션을 식별해요.
CamelAzureCosmosDbItemRequestOptions CosmosDbConstants.ITEM_REQUEST_OPTIONS CosmosItemRequestOptions 아이템 연산에서 실행할 추가 옵션을 설정해요.
CamelAzureCosmosDbItemId CosmosDbConstants.ITEM_ID String delete, replace 같은 아이템 연산에 필요한 경우 itemId를 설정해요.

컴포넌트 프로듀서가 설정하는 메시지 헤더 (Message headers set by the component producer)

Header Variable Name Type Description
CamelAzureCosmosDbRecourseId CosmosDbConstants.RESOURCE_ID String 요청한 리소스의 리소스 ID예요.
CamelAzureCosmosDbEtag CosmosDbConstants.E_TAG String 요청한 리소스의 Etag ID예요.
CamelAzureCosmosDbTimestamp CosmosDbConstants.TIMESTAMP String 요청한 리소스의 타임스탬프예요.
CamelAzureCosmosDbResponseHeaders CosmosDbConstants.RESPONSE_HEADERS Map 요청한 리소스의 응답 헤더예요.
CamelAzureCosmosDbStatusCode CosmosDbConstants.STATUS_CODE Integer 요청한 리소스의 상태 코드예요.
CamelAzureCosmosDbDefaultTimeToLiveInSeconds CosmosDbConstants.DEFAULT_TIME_TO_LIVE_SECONDS Integer 요청한 리소스의 TTL이에요.
CamelAzureCosmosDbManualThroughput CosmosDbConstants.MANUAL_THROUGHPUT Integer 요청한 리소스의 수동(manual) 처리량이에요.
CamelAzureCosmosDbAutoscaleMaxThroughput CosmosDbConstants.AUTOSCALE_MAX_THROUGHPUT Integer 요청한 리소스의 AutoscaleMaxThroughput이에요.

Azure CosmosDB 프로듀서 연산 (Azure CosmosDB Producer operations)

Camel Azure CosmosDB 컴포넌트는 프로듀서 쪽에서 폭넓은 연산을 제공해요:

서비스 수준 연산 (Operations on the service level)

이 연산들에서는 queryDatabases와 listDatabases 연산을 제외하면 databaseName이 필수예요.

Operation Description
listDatabases 모든 데이터베이스의 목록을 List<CosmosDatabaseProperties>로 교환 메시지 바디에 담아 돌려 줘요.
createDatabase 지정한 Azure CosmosDB 계정에 데이터베이스를 만들어요.
queryDatabases query가 필수예요 서비스 수준에 SQL 쿼리를 실행해서, 예를 들어 데이터베이스 목록 중 일부만 걸러서 돌려 받을 수 있어요. 교환 메시지 바디에 List<CosmosDatabaseProperties>를 담아요.

데이터베이스 수준 연산 (Operations on the database level)

이 연산들은 여기의 모든 연산에서 databaseName이 필수이고, containerName은 createContainer와 queryContainers에서만 필요해요.

Operation Description
deleteDatabase Azure CosmosDB 계정에서 데이터베이스를 삭제해요.
createContainer 지정한 Azure CosmosDB 데이터베이스에 컨테이너를 만들어요.
replaceDatabaseThroughput 지정한 Azure CosmosDB 데이터베이스의 처리량을 교체해요.
listContainers 지정한 데이터베이스의 모든 컨테이너 목록을 List<CosmosContainerProperties>로 교환 메시지 바디에 담아 돌려 줘요.
queryContainers query가 필수예요 데이터베이스 수준에 SQL 쿼리를 실행해서, 예를 들어 지정한 데이터베이스의 컨테이너 목록 중 일부만 걸러서 돌려 받을 수 있어요. 교환 메시지 바디에 List<CosmosContainerProperties>를 담아요.

컨테이너 수준 연산 (Operations on the container level)

이 연산들은 여기의 모든 연산에서 databaseName과 containerName이 필수예요.

Operation Description
deleteContainer 지정한 Azure CosmosDB 데이터베이스에서 컨테이너를 삭제해요.
replaceContainerThroughput 지정한 Azure CosmosDB 컨테이너의 처리량을 교체해요.
createItem itemPartitionKey가 필수예요 지정한 컨테이너에 아이템을 만들어요. POJO 또는 Map<String, ?> 형태의 키-값을 받아요.
upsertItem itemPartitionKey가 필수예요 지정한 컨테이너에 아이템이 없으면 만들고, 있으면 덮어써요. POJO 또는 Map<String, ?> 형태의 키-값을 받아요.
replaceItem itemPartitionKey와 itemId가 필수예요 지정한 컨테이너의 아이템을 덮어써요. POJO 또는 Map<String, ?> 형태의 키-값을 받아요.
deleteItem itemPartitionKey와 itemId가 필수예요 지정한 컨테이너의 아이템을 삭제해요.
readItem itemPartitionKey와 itemId가 필수예요 지정한 컨테이너에서 아이템을 Map<String,?>로 교환 바디 메시지에 담아 가져와요.
readItem itemPartitionKey 지정한 컨테이너에서 itemPartitionKey에 해당하는 아이템 목록을 List<Map<String,?>>로 교환 바디 메시지에 담아 가져와요.
queryItems query가 필수예요 컨테이너 수준에 SQL 쿼리를 실행해서, 예를 들어 SQL 쿼리에 맞는 아이템만 돌려 받을 수 있어요. 교환 메시지 바디에 List<Map<String,>?>를 담아요.

이 연산들을 Camel 애플리케이션에서 어떻게 쓰는지는 이 페이지의 예제 섹션을 참고하세요.

예제 (Examples)

특정 컨테이너에서 레코드 소비하기 (Consuming records from a specific container)

예를 들어 특정 데이터베이스의 특정 컨테이너에서 레코드를 소비해서 파일로 내보내려면 다음 스니펫을 쓰면 돼요:

from("azure-cosmosdb://camelDb/myContainer?accountKey=MyaccountKey&databaseEndpoint=https//myazure.com:443&leaseDatabaseName=myLeaseDB&createLeaseDatabaseIfNotExists=true&createLeaseContainerIfNotExists=true")
    .to("file://directory");
<route>
    <from uri="azure-cosmosdb://camelDb/myContainer?accountKey=MyaccountKey&amp;databaseEndpoint=https//myazure.com:443&amp;leaseDatabaseName=myLeaseDB&amp;createLeaseDatabaseIfNotExists=true&amp;createLeaseContainerIfNotExists=true"/>
    <to uri="file://directory"/>
</route>
- route:
    from:
      uri: azure-cosmosdb://camelDb/myContainer
      parameters:
        accountKey: MyaccountKey
        databaseEndpoint: "https//myazure.com:443"
        leaseDatabaseName: myLeaseDB
        createLeaseDatabaseIfNotExists: true
        createLeaseContainerIfNotExists: true
      steps:
        - to:
            uri: file://directory

연산 (Operations)

  • listDatabases:
from("direct:start")
    .to("azure-cosmosdb://?operation=listDatabases")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <to uri="azure-cosmosdb://?operation=listDatabases"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - to:
            uri: azure-cosmosdb://
            parameters:
              operation: listDatabases
        - to:
            uri: mock:result
  • createDatabase:
from("direct:start")
    .setHeader("CamelAzureCosmosDbDatabaseName", constant("myDb"))
    .to("azure-cosmosdb://?operation=createDatabase")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelAzureCosmosDbDatabaseName">
    <constant>myDb</constant>
  </setHeader>
  <to uri="azure-cosmosdb://?operation=createDatabase"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelAzureCosmosDbDatabaseName
            constant: myDb
        - to:
            uri: azure-cosmosdb://
            parameters:
              operation: createDatabase
        - to:
            uri: mock:result
  • deleteDatabase:
from("direct:start")
    .setHeader("CamelAzureCosmosDbDatabaseName", constant("myDb"))
    .to("azure-cosmosdb://?operation=deleteDatabase")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelAzureCosmosDbDatabaseName">
    <constant>myDb</constant>
  </setHeader>
  <to uri="azure-cosmosdb://?operation=deleteDatabase"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelAzureCosmosDbDatabaseName
            constant: myDb
        - to:
            uri: azure-cosmosdb://
            parameters:
              operation: deleteDatabase
        - to:
            uri: mock:result
  • createContainer:
from("direct:start")
    .setHeader("CamelAzureCosmosDbDatabaseName", constant("databaseName"))
    .setHeader("CamelAzureCosmosDbContainerName", constant("containerName"))
    .setHeader("CamelAzureCosmosDbContainerPartitionKeyPath", constant("path"))
    .setHeader("CamelAzureCosmosDbCreateDatabaseIfNotExist", constant(true))
    .to("azure-cosmosdb://?operation=createContainer")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelAzureCosmosDbDatabaseName">
    <constant>databaseName</constant>
  </setHeader>
  <setHeader name="CamelAzureCosmosDbContainerName">
    <constant>containerName</constant>
  </setHeader>
  <setHeader name="CamelAzureCosmosDbContainerPartitionKeyPath">
    <constant>path</constant>
  </setHeader>
  <setHeader name="CamelAzureCosmosDbCreateDatabaseIfNotExist">
    <constant>true</constant>
  </setHeader>
  <to uri="azure-cosmosdb://?operation=createContainer"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelAzureCosmosDbDatabaseName
            constant: databaseName
        - setHeader:
            name: CamelAzureCosmosDbContainerName
            constant: containerName
        - setHeader:
            name: CamelAzureCosmosDbContainerPartitionKeyPath
            constant: path
        - setHeader:
            name: CamelAzureCosmosDbCreateDatabaseIfNotExist
            constant: true
        - to:
            uri: azure-cosmosdb://
            parameters:
              operation: createContainer
        - to:
            uri: mock:result
  • deleteContainer:
from("direct:start")
    .setHeader("CamelAzureCosmosDbDatabaseName", constant("databaseName"))
    .setHeader("CamelAzureCosmosDbContainerName", constant("containerName"))
    .to("azure-cosmosdb://?operation=deleteContainer")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelAzureCosmosDbDatabaseName">
    <constant>databaseName</constant>
  </setHeader>
  <setHeader name="CamelAzureCosmosDbContainerName">
    <constant>containerName</constant>
  </setHeader>
  <to uri="azure-cosmosdb://?operation=deleteContainer"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelAzureCosmosDbDatabaseName
            constant: databaseName
        - setHeader:
            name: CamelAzureCosmosDbContainerName
            constant: containerName
        - to:
            uri: azure-cosmosdb://
            parameters:
              operation: deleteContainer
        - to:
            uri: mock:result
  • replaceDatabaseThroughput:

Java 전용: SDK의 ThroughputProperties 객체가 필요해요

from("direct:start")
    .process(exchange -> {
        exchange.getIn().setHeader("CamelAzureCosmosDbDatabaseName", "databaseName");
        exchange.getIn().setHeader("CamelAzureCosmosDbThroughputProperties",
                ThroughputProperties.createManualThroughput(700));
    })
    .to("azure-cosmosdb://?operation=replaceDatabaseThroughput")
    .to("mock:result");
  • queryContainers:
from("direct:start")
    .setHeader("CamelAzureCosmosDbDatabaseName", constant("databaseName"))
    .setHeader("CamelAzureCosmosDbQuery", constant("SELECT * from c where c.id = 'myAwesomeContainer'"))
    .to("azure-cosmosdb://?operation=queryContainers")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelAzureCosmosDbDatabaseName">
    <constant>databaseName</constant>
  </setHeader>
  <setHeader name="CamelAzureCosmosDbQuery">
    <constant>SELECT * from c where c.id = 'myAwesomeContainer'</constant>
  </setHeader>
  <to uri="azure-cosmosdb://?operation=queryContainers"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelAzureCosmosDbDatabaseName
            constant: databaseName
        - setHeader:
            name: CamelAzureCosmosDbQuery
            constant: "SELECT * from c where c.id = 'myAwesomeContainer'"
        - to:
            uri: azure-cosmosdb://
            parameters:
              operation: queryContainers
        - to:
            uri: mock:result
  • createItem:
from("direct:start")
    .setHeader("CamelAzureCosmosDbDatabaseName", constant("databaseName"))
    .setHeader("CamelAzureCosmosDbContainerName", constant("containerName"))
    .setHeader("CamelAzureCosmosDbContainerPartitionKeyPath", constant("partition"))
    .setHeader("CamelAzureCosmosDbItemPartitionKey", constant("test-1"))
    .setBody(constant("{\"id\":\"test-id-1\",\"partition\":\"test-1\",\"field1\":\"awesome!\"}"))
    .to("azure-cosmosdb://?operation=createItem")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelAzureCosmosDbDatabaseName">
    <constant>databaseName</constant>
  </setHeader>
  <setHeader name="CamelAzureCosmosDbContainerName">
    <constant>containerName</constant>
  </setHeader>
  <setHeader name="CamelAzureCosmosDbContainerPartitionKeyPath">
    <constant>partition</constant>
  </setHeader>
  <setHeader name="CamelAzureCosmosDbItemPartitionKey">
    <constant>test-1</constant>
  </setHeader>
  <setBody>
    <constant>{"id":"test-id-1","partition":"test-1","field1":"awesome!"}</constant>
  </setBody>
  <to uri="azure-cosmosdb://?operation=createItem"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelAzureCosmosDbDatabaseName
            constant: databaseName
        - setHeader:
            name: CamelAzureCosmosDbContainerName
            constant: containerName
        - setHeader:
            name: CamelAzureCosmosDbContainerPartitionKeyPath
            constant: partition
        - setHeader:
            name: CamelAzureCosmosDbItemPartitionKey
            constant: "test-1"
        - setBody:
            constant: '{"id":"test-id-1","partition":"test-1","field1":"awesome!"}'
        - to:
            uri: azure-cosmosdb://
            parameters:
              operation: createItem
        - to:
            uri: mock:result
  • replaceItem:
from("direct:start")
    .setHeader("CamelAzureCosmosDbDatabaseName", constant("databaseName"))
    .setHeader("CamelAzureCosmosDbContainerName", constant("containerName"))
    .setHeader("CamelAzureCosmosDbItemPartitionKey", constant("test-1"))
    .setHeader("CamelAzureCosmosDbItemId", constant("test-id-1"))
    .setBody(constant("{\"id\":\"test-id-1\",\"partition\":\"test-1\",\"field1\":\"awesome!\"}"))
    .to("azure-cosmosdb://?operation=replaceItem")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelAzureCosmosDbDatabaseName">
    <constant>databaseName</constant>
  </setHeader>
  <setHeader name="CamelAzureCosmosDbContainerName">
    <constant>containerName</constant>
  </setHeader>
  <setHeader name="CamelAzureCosmosDbItemPartitionKey">
    <constant>test-1</constant>
  </setHeader>
  <setHeader name="CamelAzureCosmosDbItemId">
    <constant>test-id-1</constant>
  </setHeader>
  <setBody>
    <constant>{"id":"test-id-1","partition":"test-1","field1":"awesome!"}</constant>
  </setBody>
  <to uri="azure-cosmosdb://?operation=replaceItem"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelAzureCosmosDbDatabaseName
            constant: databaseName
        - setHeader:
            name: CamelAzureCosmosDbContainerName
            constant: containerName
        - setHeader:
            name: CamelAzureCosmosDbItemPartitionKey
            constant: "test-1"
        - setHeader:
            name: CamelAzureCosmosDbItemId
            constant: "test-id-1"
        - setBody:
            constant: '{"id":"test-id-1","partition":"test-1","field1":"awesome!"}'
        - to:
            uri: azure-cosmosdb://
            parameters:
              operation: replaceItem
        - to:
            uri: mock:result
  • deleteItem:
from("direct:start")
    .setHeader("CamelAzureCosmosDbDatabaseName", constant("databaseName"))
    .setHeader("CamelAzureCosmosDbContainerName", constant("containerName"))
    .setHeader("CamelAzureCosmosDbItemPartitionKey", constant("test-1"))
    .setHeader("CamelAzureCosmosDbItemId", constant("test-id-1"))
    .to("azure-cosmosdb://?operation=deleteItem")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelAzureCosmosDbDatabaseName">
    <constant>databaseName</constant>
  </setHeader>
  <setHeader name="CamelAzureCosmosDbContainerName">
    <constant>containerName</constant>
  </setHeader>
  <setHeader name="CamelAzureCosmosDbItemPartitionKey">
    <constant>test-1</constant>
  </setHeader>
  <setHeader name="CamelAzureCosmosDbItemId">
    <constant>test-id-1</constant>
  </setHeader>
  <to uri="azure-cosmosdb://?operation=deleteItem"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelAzureCosmosDbDatabaseName
            constant: databaseName
        - setHeader:
            name: CamelAzureCosmosDbContainerName
            constant: containerName
        - setHeader:
            name: CamelAzureCosmosDbItemPartitionKey
            constant: "test-1"
        - setHeader:
            name: CamelAzureCosmosDbItemId
            constant: "test-id-1"
        - to:
            uri: azure-cosmosdb://
            parameters:
              operation: deleteItem
        - to:
            uri: mock:result
  • queryItems:
from("direct:start")
    .setHeader("CamelAzureCosmosDbDatabaseName", constant("databaseName"))
    .setHeader("CamelAzureCosmosDbContainerName", constant("containerName"))
    .setHeader("CamelAzureCosmosDbQuery", constant("SELECT c.id,c.field2,c.field1 from c where c.id = 'test-id-1'"))
    .to("azure-cosmosdb://?operation=queryItems")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelAzureCosmosDbDatabaseName">
    <constant>databaseName</constant>
  </setHeader>
  <setHeader name="CamelAzureCosmosDbContainerName">
    <constant>containerName</constant>
  </setHeader>
  <setHeader name="CamelAzureCosmosDbQuery">
    <constant>SELECT c.id,c.field2,c.field1 from c where c.id = 'test-id-1'</constant>
  </setHeader>
  <to uri="azure-cosmosdb://?operation=queryItems"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelAzureCosmosDbDatabaseName
            constant: databaseName
        - setHeader:
            name: CamelAzureCosmosDbContainerName
            constant: containerName
        - setHeader:
            name: CamelAzureCosmosDbQuery
            constant: "SELECT c.id,c.field2,c.field1 from c where c.id = 'test-id-1'"
        - to:
            uri: azure-cosmosdb://
            parameters:
              operation: queryItems
        - to:
            uri: mock:result

Azure CosmosDB 컨슈머 (Azure CosmosDB Consumer)

Camel Azure CosmosDB는 ChangeFeed 패턴을 써서 이벤트 피드를 캡처하고, 비동기 방식으로 Camel에 공급해요. Change Data Capture(CDC) 디자인 패턴과 비슷한 개념이죠. 다만 삭제(deletion)는 피드에서도 함께 제거되기 때문에 캡처하지 않아요.

Camel Azure CosmosDB를 쓰려면 containerName과 databaseName이 필요해요. 하지만 이 기능을 쓰려면 더 설정해야 하는 옵션들도 있어요:

  • leaseDatabaseName: leaseContainerName이 저장될 리스 데이터베이스를 설정해요. 지정하지 않으면 이 컴포넌트는 databaseName에 지정된 것과 같은 데이터베이스에 리스 컨테이너를 저장해요. createLeaseDatabaseIfNotExists를 true로 설정하면 자동으로 생성돼요.

  • leaseContainerName: 상태 저장소 역할을 하며 여러 워커에 걸쳐 change feed 처리를 조정하는 리스 컨테이너를 설정해요. 리스 컨테이너는 모니터링 대상 컨테이너와 같은 계정에 둘 수도 있고 별도 계정에 둘 수도 있어요. createLeaseContainerIfNotExists를 true로 설정하면 자동으로 생성돼요. 지정하지 않으면 이 컴포넌트가 camel-lease라는 이름의 컨테이너를 만들어요.

  • hostName: 호스트명을 설정해요. 호스트(host)란 change feed processor를 써서 변경 사항을 리스닝하는 애플리케이션 인스턴스예요. 같은 리스 설정으로 여러 인스턴스가 병렬로 실행될 수 있지만, 각 인스턴스는 서로 다른 인스턴스 이름을 가져야 해요. 지정하지 않으면 무작위 호스트명이 생성돼요.

  • changeFeedProcessorOptions: change feed 프로세서에 대한 추가 옵션을 설정해요.

컨슈머는 교환 메시지 바디에 List<Map<String,>>를 설정하는데, 이는 하나의 피드에 담긴 아이템 목록을 반영해요.

예제 (Example)

예를 들어 myDb의 myContainer 컨테이너에서 이벤트를 리스닝하려면:

from("azure-cosmosdb://myDb/myContainer?leaseDatabaseName=myLeaseDb&createLeaseDatabaseIfNotExists=true&createLeaseContainerIfNotExists=true")
    .to("mock:result");
<route>
    <from uri="azure-cosmosdb://myDb/myContainer?leaseDatabaseName=myLeaseDb&amp;createLeaseDatabaseIfNotExists=true&amp;createLeaseContainerIfNotExists=true"/>
    <to uri="mock:result"/>
</route>
- route:
    from:
      uri: azure-cosmosdb://myDb/myContainer
      parameters:
        leaseDatabaseName: myLeaseDb
        createLeaseDatabaseIfNotExists: true
        createLeaseContainerIfNotExists: true
      steps:
        - to:
            uri: mock:result

중요한 개발 참고 사항 (Important Development Notes)

이 컴포넌트를 개발할 때는 통합 테스트를 실행하려면 Azure accessKey를 발급받아야 해요. 모의(mock) 단위 테스트 외에도, 변경을 만들 때마다, 심지어 클라이언트를 업그레이드할 때마다 통합 테스트를 실행해야 해요. Azure 클라이언트는 사소한 버전 업그레이드에서도 문제를 일으킬 수 있거든요. 통합 테스트를 실행하려면 이 컴포넌트 디렉터리에서 다음 maven 명령을 실행하세요:

mvn clean install -Dendpoint={{dbaddress}} -DaccessKey={{accessKey}}

여기서 endpoint는 Azure CosmosDB 엔드포인트 이름이고, accessKey는 Azure CosmosDB 포털에서 생성한 액세스 키예요.

더 알아보기 (Learn more)

  • Cosmos SQL API 쿼리 작성법이 궁금하면 query 옵션 설명에 링크된 SQL query getting started 문서를 참고하세요.
  • 컨슈머 ChangeFeed 동작의 배경은 change feed design patterns 문서에서 확인할 수 있어요.
  • 실제 연동을 시작할 때는 위 예제 섹션의 컨슈머/프로듀서 스니펫을 그대로 따라 해 보고, 인증은 accountKey+databaseEndpoint를 쓰거나 cosmosAsyncClient를 주입하는 방식 중 상황에 맞는 것을 고르면 돼요.