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 같은 것들이 있을 수 있어요.
옵션이 몇 개뿐인 컴포넌트도 있고, 많은 컴포넌트도 있어요. 컴포넌트에는 보통 널리 쓰이는 기본값이 미리 설정되어 있어서, 컴포넌트에 설정할 옵션이 몇 개뿐이거나 아예 없는 경우가 많아요.
컴포넌트는 다음 방법으로 설정할 수 있어요:
-
설정 파일(
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&databaseEndpoint=https//myazure.com:443&leaseDatabaseName=myLeaseDB&createLeaseDatabaseIfNotExists=true&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&createLeaseDatabaseIfNotExists=true&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를 주입하는 방식 중 상황에 맞는 것을 고르면 돼요.