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

Dapr

원문 보기 위키 갱신

Dapr (Dapr 컴포넌트)

Dapr 컴포넌트는 Dapr 빌딩 블록(Dapr Building Blocks)과 상호작용할 수 있게 해 줘요. Camel 4.12부터 제공됐고 컨슈머와 프로듀서를 모두 지원해요. 서비스 호출, 상태 관리, Pub/Sub, 바인딩, 시크릿, 구성, 락, 워크플로 연산을 라우트에서 바로 쓸 수 있어요.

출처: 문서

본문

Camel 4.12부터 지원

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

Dapr 컴포넌트는 Dapr 빌딩 블록(Dapr Building Blocks)과 상호작용할 수 있는 기능을 제공해요.

URI 형식 (URI format)

dapr:operation[?options]

operation은 상호작용할 Dapr 빌딩 블록을 나타내요.

옵션 설정 (Configuring Options)

Camel 컴포넌트는 서로 다른 두 단계로 설정해요:

  • component level

  • endpoint level

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

컴포넌트 레벨에서는 엔드포인트들이 이어서 물려받는 일반적이고 공유되는 설정을 해요. 가장 상위의 설정 레벨이죠.

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

컴포넌트에 따라 옵션이 몇 개뿐인 것도 있고 아주 많은 것도 있어요. 컴포넌트는 보통 널리 쓰이는 기본값이 미리 설정되어 있어서, 몇 가지 옵션만 설정하거나 아예 하나도 건드리지 않아도 되는 경우가 많아요.

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

  • the Component DSL.

  • in a configuration file (application.properties, *.yaml files, etc).

  • directly in the Java code.

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

엔드포인트는 옵션이 많아서 설정에 시간을 더 쓰게 될 거예요. 이 옵션들이 엔드포인트가 원하는 일을 하도록 커스터마이즈해 줘요. 옵션은 엔드포인트가 컨슈머(from)로 쓰이는지, 프로듀서(to)로 쓰이는지, 둘 다인지에 따라 분류되기도 해요.

엔드포인트 설정은 대부분 엔드포인트 URI에 _path_와 query 파라미터로 바로 하는 경우가 많아요. Endpoint DSL과 DataFormat DSL을 쓰면 자바에서 엔드포인트와 데이터 포맷을 _타입 세이프_하게 설정할 수도 있어요.

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

프로퍼티 플레이스홀더는 이런 장점이 있어요:

  • They help prevent using hardcoded urls, port numbers, sensitive information, and other settings.

  • They allow externalizing the configuration from the code.

  • They help the code to become more flexible and reusable.

다음 두 섹션에서 모든 옵션을 나열해요. 먼저 컴포넌트 옵션, 그다음 엔드포인트 옵션 순서예요.

컴포넌트 옵션 (Component Options)

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

Name Description Default Type
client (common) Autowired Dapr 클라이언트(Dapr Client). DaprClient
configKeys (common) 구성 연산에 사용할 키 목록. String
configStore (common) 상호작용할 Dapr 구성 스토어의 이름. statestore.yaml 설정에 정의돼요. String
configuration (common) 컴포넌트 설정이에요. DaprConfiguration
contentType (common) Pub/Sub 컴포넌트가 사용할 contentType이에요. String
previewClient (common) Autowired Dapr 프리뷰 클라이언트(Dapr Preview Client). DaprPreviewClient
pubSubName (common) 사용할 Dapr Pub/Sub 컴포넌트의 이름이에요. 이벤트를 퍼블리시하거나 구독할 때 Dapr가 어떤 기반 메시징 시스템과 상호작용할지 식별해요. String
topic (common) 구독할 토픽의 이름이에요. 해당 토픽은 지정한 pubsubName 아래 설정된 Pub/Sub 컴포넌트에 존재해야 해요. String
bridgeErrorHandler (consumer) 컨슈머를 Camel 라우팅 에러 핸들러(Error Handler)에 브리지할 수 있게 해 줘요. 즉, Camel 컨슈머가 들어오는 메시지를 집어 올리는 동안 등에서 예외가 발생하면(가능한 경우), 그 예외를 메시지로 처리해서 라우팅 에러 핸들러가 다루게 돼요. 중요: 이것은 서드파티 컴포넌트가 예외가 던져졌을 때 Camel에 알릴 수 있도록 허용하는 경우에만 가능해요. 일부 컴포넌트는 내부에서만 처리하기 때문에 bridgeErrorHandler를 쓸 수 없어요. 다른 상황에서는 Camel 컴포넌트를 개선해서 서드파티 컴포넌트에 연결(hook)해 이를 가능하게 만들 수도 있어요. 기본으로 컨슈머는 org.apache.camel.spi.ExceptionHandler로 예외를 처리하는데, WARN 또는 ERROR 레벨로 로그를 남기고 무시해요. false boolean
bindingName (producer) 호출할 Dapr 바인딩의 이름이에요. String
bindingOperation (producer) 바인딩에 수행할 연산이에요. String
concurrency (producer)
상태 연산에 사용할 동시성(concurrency) 모드예요.

Enum values:

  • FIRST_WRITE

  • LAST_WRITE

| | Concurrency | | consistency (producer) |

상태 연산에 사용할 일관성(consistency) 수준이에요.

Enum values:

  • EVENTUAL

  • STRONG

| | Consistency | | eTag (producer) | 상태 저장 또는 삭제 연산에서 낙관적 동시성(optimistic concurrency)에 쓰이는 eTag예요. | | String | | eventName (producer) | 이벤트의 이름이에요. 이벤트 이름은 대소문자를 구분하지 않아요. | | String | | expiryInSeconds (producer) | 락의 만료 시간(초)이에요. | | Integer | | getWorkflowIO (producer) | 워크플로 인스턴스의 입력, 출력, 커스텀 상태를 가져오려면 true, 생략하려면 false로 설정해요. | false | boolean | | httpExtension (producer) | Autowired 서비스를 호출할 때 사용할 HTTP 메서드예요. GET, POST, PUT, DELETE 같은 동사를 받아들여요. 헤더나 쿼리 파라미터 없는 최소한의 HttpExtension을 만들어요. verb보다 우선해요. | | HttpExtension | | key (producer) | 지정한 상태/시크릿 스토어 안에서 상태/시크릿 객체를 식별하는 데 쓰이는 키예요. | | String | | lazyStartProducer (producer) | 프로듀서를 느리게(lazy, 첫 메시지가 올 때) 시작할지 여부예요. 느리게 시작하면, 프로듀서가 시작 중에 실패해서 라우트 시작 자체가 실패하는 상황에서도 CamelContext와 라우트를 시작할 수 있어요. 시작을 늦춰 두면 실패가 발생했을 때 메시지를 라우팅하는 동안 Camel의 라우팅 에러 핸들러로 처리할 수 있죠. 단, 첫 메시지를 처리할 때 프로듀서를 만들고 시작하는 데 시간이 조금 걸려서 전체 처리 시간이 길어질 수 있다는 점은 감안하세요. | false | boolean | | lockOperation (producer) |

스토어에 수행할 락 연산이에요. DaprOperation.lock 연산에 필요해요.

Enum values:

  • tryLock

  • unlock

| tryLock | LockOperation | | lockOwner (producer) | 락의 소유자 식별자예요. | | String | | methodToInvoke (producer) | 대상 서비스에서 호출할 메서드 또는 라우트의 이름이에요. | | String | | reason (producer) | 워크플로 인스턴스를 일시 중지/재개하는 이유예요. | | String | | resourceId (producer) | 락의 리소스 ID예요. | | String | | secretStore (producer) | 상호작용할 Dapr 시크릿 스토어의 이름. local-secret-store.yaml 설정에 정의돼요. | | String | | serviceToInvoke (producer) | 호출할 대상 서비스예요. Dapr App ID, 이름 붙은 HTTPEndpoint, 또는 FQDN/퍼블릭 URL이 될 수 있어요. | | String | | stateOperation (producer) |

상태 스토어에 수행할 상태 연산이에요. DaprOperation.state 연산에 필요해요.

Enum values:

  • save

  • saveBulk

  • get

  • getBulk

  • delete

  • executeTransaction

| get | StateOperation | | stateStore (producer) | 상호작용할 Dapr 상태 스토어의 이름. statestore.yaml 설정에 정의돼요. | | String | | storeName (producer) | 락 스토어의 이름이에요. | | String | | timeout (producer) | 워크플로 인스턴스가 시작/완료되기를 기다릴 시간이에요. | | Duration | | verb (producer) | 메서드를 호출할 때 사용할 HTTP 동사예요. | POST | String | | workflowClass (producer) | io.dapr.workflows.Workflow를 구현하는 클래스의 FQCN이에요. | | String | | workflowClient (producer) | Autowired Dapr 워크플로 클라이언트(Dapr Workflow Client). | | DaprWorkflowClient | | workflowInstanceId (producer) | 워크플로의 인스턴스 ID예요. | | String | | workflowOperation (producer) |

수행할 워크플로 연산이에요. DaprOperation.workflow 연산에 필요해요.

Enum values:

  • scheduleNew

  • terminate

  • purge

  • suspend

  • resume

  • state

  • waitForInstanceStart

  • waitForInstanceCompletion

  • raiseEvent

| scheduleNew | WorkflowOperation | | workflowStartTime (producer) | 새 워크플로의 시작 시간이에요. | | Instant | | workflowVersion (producer) | 시작할 워크플로의 버전이에요. | | String | | autowiredEnabled (advanced) | 오토와이어링(autowiring)을 활성화할지 여부예요. 레지스트리에서 일치하는 타입의 인스턴스가 딱 하나 있는지 찾아서, 그 인스턴스로 오토와이어링 옵션(옵션이 autowired로 표시되어 있어야 함)을 자동 설정하는 데 쓰여요. JDBC 데이터 소스, JMS 커넥션 팩토리, AWS 클라이언트 등을 자동 설정할 때 사용할 수 있어요. | true | boolean | | headerFilterStrategy (advanced) | Camel 메시지와 주고받는 헤더를 필터링할 커스텀 HeaderFilterStrategy를 사용해요. | | HeaderFilterStrategy |

엔드포인트 옵션 (Endpoint Options)

Dapr 엔드포인트는 다음 URI 문법으로 설정해요:

dapr:operation

다음 path 및 query 파라미터를 사용해요:

경로 파라미터 (Path Parameters)

Name Description Default Type
operation (producer)
필수 이 컴포넌트로 수행할 Dapr 빌딩 블록 연산이에요.

Enum values:

  • invokeService

  • state

  • pubSub

  • invokeBinding

  • secret

  • configuration

  • lock

  • workflow

| | DaprOperation |

쿼리 파라미터 (Query Parameters)

Name Description Default Type
client (common) Autowired Dapr 클라이언트(Dapr Client). DaprClient
configKeys (common) 구성 연산에 사용할 키 목록. String
configStore (common) 상호작용할 Dapr 구성 스토어의 이름. statestore.yaml 설정에 정의돼요. String
contentType (common) Pub/Sub 컴포넌트가 사용할 contentType이에요. String
previewClient (common) Autowired Dapr 프리뷰 클라이언트(Dapr Preview Client). DaprPreviewClient
pubSubName (common) 사용할 Dapr Pub/Sub 컴포넌트의 이름이에요. 이벤트를 퍼블리시하거나 구독할 때 Dapr가 어떤 기반 메시징 시스템과 상호작용할지 식별해요. String
topic (common) 구독할 토픽의 이름이에요. 해당 토픽은 지정한 pubsubName 아래 설정된 Pub/Sub 컴포넌트에 존재해야 해요. 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 | | bindingName (producer) | 호출할 Dapr 바인딩의 이름이에요. | | String | | bindingOperation (producer) | 바인딩에 수행할 연산이에요. | | String | | concurrency (producer) |

상태 연산에 사용할 동시성(concurrency) 모드예요.

Enum values:

  • FIRST_WRITE

  • LAST_WRITE

| | Concurrency | | consistency (producer) |

상태 연산에 사용할 일관성(consistency) 수준이에요.

Enum values:

  • EVENTUAL

  • STRONG

| | Consistency | | eTag (producer) | 상태 저장 또는 삭제 연산에서 낙관적 동시성(optimistic concurrency)에 쓰이는 eTag예요. | | String | | eventName (producer) | 이벤트의 이름이에요. 이벤트 이름은 대소문자를 구분하지 않아요. | | String | | expiryInSeconds (producer) | 락의 만료 시간(초)이에요. | | Integer | | getWorkflowIO (producer) | 워크플로 인스턴스의 입력, 출력, 커스텀 상태를 가져오려면 true, 생략하려면 false로 설정해요. | false | boolean | | httpExtension (producer) | Autowired 서비스를 호출할 때 사용할 HTTP 메서드예요. GET, POST, PUT, DELETE 같은 동사를 받아들여요. 헤더나 쿼리 파라미터 없는 최소한의 HttpExtension을 만들어요. verb보다 우선해요. | | HttpExtension | | key (producer) | 지정한 상태/시크릿 스토어 안에서 상태/시크릿 객체를 식별하는 데 쓰이는 키예요. | | String | | lockOperation (producer) |

스토어에 수행할 락 연산이에요. DaprOperation.lock 연산에 필요해요.

Enum values:

  • tryLock

  • unlock

| tryLock | LockOperation | | lockOwner (producer) | 락의 소유자 식별자예요. | | String | | methodToInvoke (producer) | 대상 서비스에서 호출할 메서드 또는 라우트의 이름이에요. | | String | | reason (producer) | 워크플로 인스턴스를 일시 중지/재개하는 이유예요. | | String | | resourceId (producer) | 락의 리소스 ID예요. | | String | | secretStore (producer) | 상호작용할 Dapr 시크릿 스토어의 이름. local-secret-store.yaml 설정에 정의돼요. | | String | | serviceToInvoke (producer) | 호출할 대상 서비스예요. Dapr App ID, 이름 붙은 HTTPEndpoint, 또는 FQDN/퍼블릭 URL이 될 수 있어요. | | String | | stateOperation (producer) |

상태 스토어에 수행할 상태 연산이에요. DaprOperation.state 연산에 필요해요.

Enum values:

  • save

  • saveBulk

  • get

  • getBulk

  • delete

  • executeTransaction

| get | StateOperation | | stateStore (producer) | 상호작용할 Dapr 상태 스토어의 이름. statestore.yaml 설정에 정의돼요. | | String | | storeName (producer) | 락 스토어의 이름이에요. | | String | | timeout (producer) | 워크플로 인스턴스가 시작/완료되기를 기다릴 시간이에요. | | Duration | | verb (producer) | 메서드를 호출할 때 사용할 HTTP 동사예요. | POST | String | | workflowClass (producer) | io.dapr.workflows.Workflow를 구현하는 클래스의 FQCN이에요. | | String | | workflowClient (producer) | Autowired Dapr 워크플로 클라이언트(Dapr Workflow Client). | | DaprWorkflowClient | | workflowInstanceId (producer) | 워크플로의 인스턴스 ID예요. | | String | | workflowOperation (producer) |

수행할 워크플로 연산이에요. DaprOperation.workflow 연산에 필요해요.

Enum values:

  • scheduleNew

  • terminate

  • purge

  • suspend

  • resume

  • state

  • waitForInstanceStart

  • waitForInstanceCompletion

  • raiseEvent

| scheduleNew | WorkflowOperation | | workflowStartTime (producer) | 새 워크플로의 시작 시간이에요. | | Instant | | workflowVersion (producer) | 시작할 워크플로의 버전이에요. | | String | | lazyStartProducer (producer (advanced)) | 프로듀서를 느리게(lazy, 첫 메시지가 올 때) 시작할지 여부예요. 느리게 시작하면, 프로듀서가 시작 중에 실패해서 라우트 시작 자체가 실패하는 상황에서도 CamelContext와 라우트를 시작할 수 있어요. 시작을 늦춰 두면 실패가 발생했을 때 메시지를 라우팅하는 동안 Camel의 라우팅 에러 핸들러로 처리할 수 있죠. 단, 첫 메시지를 처리할 때 프로듀서를 만들고 시작하는 데 시간이 조금 걸려서 전체 처리 시간이 길어질 수 있다는 점은 감안하세요. | false | boolean | | headerFilterStrategy (advanced) | Camel 메시지와 주고받는 헤더를 필터링할 커스텀 HeaderFilterStrategy를 사용해요. | | HeaderFilterStrategy |

메시지 헤더 (Message Headers)

Dapr 컴포넌트는 아래 나열된 메시지 헤더(들)를 지원해요:

Name Description Default Type
CamelDaprServiceToInvoke (producer) Constant: SERVICE_TO_INVOKE 호출할 대상 서비스예요. Dapr App ID, 이름 붙은 HTTPEndpoint, 또는 FQDN/퍼블릭 URL이 될 수 있어요. String
CamelDaprMethodToInvoke (producer) Constant: METHOD_TO_INVOKE 대상 서비스에서 호출할 메서드 또는 라우트의 이름이에요. String
CamelDaprVerb (producer) Constant: VERB 서비스 호출에 사용할 HTTP 동사예요. String
CamelDaprQueryParameters (producer) Constant: QUERY_PARAMETERS HTTP 요청의 쿼리 파라미터예요. Map
CamelDaprHttpHeaders (producer) Constant: HTTP_HEADERS HTTP 요청의 헤더예요. Map
CamelDaprHttpExtension (producer) Constant: HTTP_EXTENSION 서비스 호출에 사용할 HttpExtension 객체예요. verb보다 우선해요. HttpExtension
CamelDaprStateOperation (producer) Constant: STATE_OPERATION 상태 스토어에 수행할 상태 연산이에요. DaprOperation.state 연산에 필요해요. get StateOperation
CamelDaprStateStore (producer) Constant: STATE_STORE 상호작용할 Dapr 상태 스토어의 이름. statestore.yaml 설정에 정의돼요. String
CamelDaprSecretStore (producer) Constant: SECRET_STORE 상호작용할 Dapr 시크릿 스토어의 이름. local-secret-store.yaml 설정에 정의돼요. String
CamelDaprConfigStore (producer) Constant: CONFIG_STORE 상호작용할 Dapr 구성(config) 스토어의 이름. statestore.yaml 설정에 정의돼요. String
CamelDaprKey (producer) Constant: KEY 지정한 상태/시크릿 스토어 안에서 상태/시크릿 객체를 식별하는 데 쓰이는 키예요. String
CamelDaprETag (producer) Constant: E_TAG 상태 저장 또는 삭제 연산에서 낙관적 동시성(optimistic concurrency)에 쓰이는 eTag예요. String
CamelDaprConcurrency (producer) Constant: CONCURRENCY
상태 연산에 사용할 동시성(concurrency) 모드예요.

Enum values:

  • FIRST_WRITE

  • LAST_WRITE

| | Concurrency | | CamelDaprConsistency (producer) Constant: CONSISTENCY |

상태 연산에 사용할 일관성(consistency) 수준이에요.

Enum values:

  • EVENTUAL

  • STRONG

| | Consistency | | CamelDaprMetadata (producer) Constant: METADATA | 상태 스토어에 함께 전달할 추가 키-값 쌍이에요. | | Map | | CamelDaprStates (producer) Constant: STATES | 벌크 저장 연산에 사용할 상태 목록이에요. | | List | | CamelDaprKeys (producer) Constant: KEYS | 벌크 조회 연산에 사용할 키 목록이에요. | | List | | CamelDaprTransactions (producer) Constant: TRANSACTIONS | execute transactions 상태 연산에 사용할 트랜잭션 목록이에요. | | List | | CamelDaprPubSubName (common) Constant: PUBSUB_NAME | 사용할 Dapr Pub/Sub 컴포넌트의 이름이에요. 이벤트를 퍼블리시하거나 구독할 때 Dapr가 어떤 기반 메시징 시스템과 상호작용할지 식별해요. | | String | | CamelDaprTopic (common) Constant: TOPIC | 구독할 토픽의 이름이에요. 해당 토픽은 지정한 pubsubName 아래 설정된 Pub/Sub 컴포넌트에 존재해야 해요. | | String | | CamelDaprContentType (common) Constant: CONTENT_TYPE | Pub/Sub 컴포넌트가 사용할 콘텐츠 타입(content type)이에요. | | String | | CamelDaprID (consumer) Constant: ID | 이벤트의 고유 식별자예요. 다른 이벤트와 구분하는 데 쓰여요. | | String | | CamelDaprSource (consumer) Constant: SOURCE | 이벤트의 발생 출처예요. 보통 이벤트를 만든 컴포넌트나 서비스를 나타내는 URI예요. | | String | | CamelDaprType (consumer) Constant: TYPE | 클라우드 이벤트 유형을 나타내는 문자열이에요. | | String | | CamelDaprSpecificVersion (consumer) Constant: SPECIFIC_VERSION | 이 이벤트가 따르는 CloudEvents 명세의 버전이에요. | | String | | CamelDaprDataContentType (consumer) Constant: DATA_CONTENT_TYPE | 이벤트 데이터의 콘텐츠 타입이에요. | | String | | CamelDaprBinaryData (consumer) Constant: BINARY_DATA | 이벤트의 원시 바이너리 데이터 페이로드예요. 있는 경우에만 채워져요(data 대신 data_base64를 쓰는 이벤트). | | byte[] | | CamelDaprTime (consumer) Constant: TIME | 이벤트가 발생한 시각이에요. | | OffsetDateTime | | CamelDaprTraceParent (consumer) Constant: TRACE_PARENT | 서비스 간 이벤트 추적에 쓰이는 트레이싱 정보예요(trace ID와 span ID를 포함해요). | | String | | CamelDaprTraceState (consumer) Constant: TRACE_STATE | 벤더별 추가 트레이스 컨텍스트예요. | | String | | CamelDaprBindingName (producer) Constant: BINDING_NAME | 호출할 Dapr 바인딩의 이름이에요. | | String | | CamelDaprBindingOperation (producer) Constant: BINDING_OPERATION | 바인딩에 수행할 연산이에요. | | String | | CamelDaprConfigKeys (producer) Constant: CONFIG_KEYS | 구성 연산에 사용할 키 목록. | | String | | CamelDaprSubscriptionId (consumer) Constant: SUBSCRIPTION_ID | 구성 변경 구독의 ID예요. | | String | | CamelDaprRawConfigResponse (common) Constant: RAW_CONFIG_RESPONSE | 원시 구성 업데이트 응답이에요. | | ConfigurationItem | | CamelDaprLockOperation (producer) Constant: LOCK_OPERATION | 스토어에 수행할 락 연산이에요. DaprOperation.lock 연산에 필요해요. | tryLock | LockOperation | | CamelDaprStoreName (producer) Constant: STORE_NAME | 락 스토어의 이름이에요. | | String | | CamelDaprResourceId (producer) Constant: RESOURCE_ID | 락의 리소스 ID예요. | | String | | CamelDaprLockOwner (producer) Constant: LOCK_OWNER | 락의 소유자 식별자예요. | | String | | CamelDaprExpiryInSeconds (producer) Constant: EXPIRY_IN_SECONDS | 락의 만료 시간(초)이에요. | | Integer | | CamelDaprWorkflowOperation (producer) Constant: WORKFLOW_OPERATION | 수행할 워크플로 연산이에요. DaprOperation.workflow 연산에 필요해요. | scheduleNew | WorkflowOperation | | CamelDaprWorkflowClass (producer) Constant: WORKFLOW_CLASS | io.dapr.workflows.Workflow를 구현하는 클래스의 FQCN이에요. | | String | | CamelDaprWorkflowVersion (producer) Constant: WORKFLOW_VERSION | 시작할 워크플로의 버전이에요. | | String | | CamelDaprWorkflowInstanceId (producer) Constant: WORKFLOW_INSTANCE_ID | 워크플로의 인스턴스 ID예요. | | String | | CamelDaprWorkflowStartTime (producer) Constant: WORKFLOW_START_TIME | 새 워크플로의 시작 시간이에요. | | Instant | | CamelDaprSuspendReason (producer) Constant: REASON | 워크플로 인스턴스를 일시 중지/재개하는 이유예요. | | String | | CamelDaprNewWorkflowInstanceId (producer) Constant: NEW_WORKFLOW_INSTANCE_ID | 새로 예약된 워크플로의 인스턴스 ID예요. | | String | | CamelDaprGetWorkflowIO (producer) Constant: GET_WORKFLOW_IO | 워크플로 인스턴스의 입력, 출력, 커스텀 상태를 가져오려면 true, 생략하려면 false로 설정해요. | | boolean | | CamelDaprWorkflowName (producer) Constant: WORKFLOW_NAME | 워크플로의 이름이에요. | | String | | CamelDaprWorkflowCreatedAt (producer) Constant: WORKFLOW_CREATED_AT | 워크플로 인스턴스의 생성 시각(UTC)이에요. | | Instant | | CamelDaprWorkflowUpdatedAt (producer) Constant: WORKFLOW_UPDATED_AT | 워크플로 인스턴스의 마지막 업데이트 시각(UTC)이에요. | | Instant | | CamelDaprWorkflowSerializedInput (producer) Constant: WORKFLOW_SERIALIZED_INPUT | 워크플로 인스턴스의 직렬화된 입력이에요. 있으면 채워져요. | | String | | CamelDaprWorkflowSerializedOutput (producer) Constant: WORKFLOW_SERIALIZED_OUTPUT | 워크플로 인스턴스의 직렬화된 출력이에요. 있으면 채워져요. | | String | | CamelDaprWorkflowFailureDetails (producer) Constant: WORKFLOW_FAILURE_DETAILS | 실패한 워크플로 인스턴스의 실패 상세 정보예요. 없으면 null이에요. | | WorkflowFailureDetails | | CamelDaprIsWorkflowRunning (producer) Constant: IS_WORKFLOW_RUNNING | 워크플로가 존재하고 실행 중 상태였으면 true, 아니면 false로 설정돼요. | | boolean | | CamelDaprIsWorkflowCompleted (producer) Constant: IS_WORKFLOW_COMPLETED | 워크플로가 종료(terminal) 상태였으면 true, 아니면 false로 설정돼요. | | boolean | | CamelDaprTimeout (producer) Constant: TIMEOUT | 워크플로 인스턴스가 시작/완료되기를 기다릴 시간이에요. | | Duration | | CamelDaprEventName (producer) Constant: EVENT_NAME | 이벤트의 이름이에요. 이벤트 이름은 대소문자를 구분하지 않아요. | | String |

Dapr 프로듀서 연산 (Dapr Producer operations)

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

1. invokeService:

서비스 호출(service invocation)을 쓰면 애플리케이션이 표준 HTTP 프로토콜로 다른 애플리케이션과 안정적이고 안전하게 통신할 수 있어요. 이 연산에서는 serviceToInvoke와 methodToInvoke가 필수예요.

2. state:

Dapr의 상태 관리(state management)는 애플리케이션이 키-값 쌍을 안정적이고 일관되게 저장, 조회, 삭제할 수 있게 해 줘요. 이 연산들에서는 stateStore가 필요해요.

스테이트 연산 (State Operations)

Operation Description
save 상태 스토어에 키-값 쌍 하나를 저장하거나 업데이트해요. 이 연산에서는 payload와 key가 필요해요.
saveBulk 상태 스토어에 키-값 쌍 여러 개를 한 번의 연산으로 저장하거나 업데이트해요. 이 연산에서는 (List<State<?>>) states가 필요한 필드예요.
get 상태 스토어에서 특정 키의 값을 조회해요. 이 연산에서는 key가 필요한 필드예요.
getBulk 상태 스토어에서 여러 키의 값을 한 번의 요청으로 조회해요. 이 연산에서는 (List) keys가 필요한 필드예요.
delete 상태 스토어에서 특정 키와 그에 연결된 값을 제거해요. 이 연산에서는 key가 필요한 필드예요.
executeTransaction 여러 연산(save 또는 delete)을 트랜잭션 안에서 원자적으로 실행해요. 이 연산에서는 (List<TransactionalStateOperation<?>>) transactions가 필요한 필드예요.

2. pubSub:

Dapr의 퍼블리시-서브스크라이브(Pub/Sub) 빌딩 블록은 마이크로서비스 간 비동기, 이벤트 기반 통신을 가능하게 해 줘요. 이 연산에서는 pubSubName과 topic이 필요해요.

3. invokeBinding:

Dapr의 바인딩(bindings) 빌딩 블록은 입력/출력 바인딩을 통해 외부 시스템과 상호작용할 수 있게 해 줘요. invokeBinding 연산은 설정된 출력 바인딩으로 데이터를 보낼 수 있게 해 줘요. 이 연산은 bindingName(바인딩 컴포넌트의 이름)과 bindingOperation(바인딩의 기능에 따라 create, get, delete 같은 값)을 지정해야 해요.

4. secret:

Dapr의 시크릿 관리(secret management) 빌딩 블록은 외부 시크릿 스토어에서 시크릿을 안전하게 조회할 수 있게 해 줘요. secret 연산은 지정한 시크릿 스토어에서 시크릿을 가져와요. key를 주면 해당 시크릿을 조회하고, key를 지정하지 않으면 스토어의 모든 시크릿을 한 번에 가져와요. 이 연산은 secretStore 이름이 필요하고, key는 선택이에요.

5. configuration:

Dapr의 구성(configuration) 빌딩 블록은 애플리케이션이 외부 구성 스토어에서 동적 구성 값을 조회할 수 있게 해 줘요. configuration 연산은 configKeys에 지정한 키에 연결된 값을 가져와요. 이 연산은 configStore 이름과 configKeys가 필요해요.

6. lock:

Dapr의 락 관리(lock management)는 분산 락 메커니즘으로 공유 자원 접근을 조율하게 해 줘요. 서비스 간 상호 배제를 보장할 때 유용해요. 이 연산들에서는 storeName, resourceId, lockOwner가 필수예요.

락 연산 (Lock Operations)

Operation Description
tryLock 일정 기간 동안 리소스에 락 획득을 시도해요. 이 연산에서는 expiryInSeconds가 필요해요. 락 획득에 성공하면 Boolean — true, 아니면 false를 반환해요.
unlock 이전에 획득한 락을 해제해요. 락이 성공적으로 해제됐는지 나타내는 UnlockResponseStatus enum을 반환해요.

7. workflow:

Dapr 워크플로는 개발자가 오래 실행되고, 지속되며, 신뢰할 수 있는 프로세스를 코드로 작성할 수 있게 해 줘요. Dapr Workflow는 마이크로서비스 아키텍처의 복잡한 상태 조율 요구를 단순화해 줘요.

워크플로 연산 (Workflow Operations)

Operation Description
scheduleNew 새 워크플로 인스턴스 생성을 예약해요. workflowClass가 필요하고 workflowVersion, workflowInstanceId, workflowStartTime은 선택이에요. 메시지 바디가 워크플로 입력으로 쓰여요.
terminate 실행 중인 워크플로 인스턴스를 종료해요. workflowInstanceId가 필요해요. 메시지 바디로 종료된 워크플로의 출력을 제공할 수 있어요.
purge 상태 스토어에서 워크플로 인스턴스의 메타데이터를 삭제(purge)해요. workflowInstanceId가 필요해요.
suspend 실행 중인 워크플로 인스턴스를 일시 중지해요. workflowInstanceId와 reason이 필요해요.
resume 일시 중지된 워크플로 인스턴스를 재개해요. workflowInstanceId와 reason이 필요해요.
state 워크플로 인스턴스의 현재 런타임 상태를 조회해요. workflowInstanceId가 필요해요.
waitForInstanceStart 워크플로 인스턴스가 실행을 시작하기를 기다려요. workflowInstanceId와 timeout이 필요해요.
waitForInstanceCompletion 워크플로 인스턴스가 완료되기를 기다려요. workflowInstanceId와 timeout이 필요해요.
raiseEvent 그 이벤트를 기다리고 있는 실행 중인 워크플로 인스턴스에 이벤트를 보내요. workflowInstanceId와 eventName이 필요해요. 메시지 바디가 이벤트 페이로드로 쓰여요.

Dapr 컨슈머 연산 (Dapr Consumer operations)

1. pubSub:

Apache Camel의 Dapr PubSub 컨슈머는 라우트가 Dapr가 지원하는 Pub/Sub 시스템에서 이벤트를 소비할 수 있게 해 줘요. 지정한 pubsub 컴포넌트(pubSubName)의 특정 토픽을 구독하고, 들어오는 CloudEvent를 Camel Exchange 객체로 처리해요.

컨슈머를 설정하려면 pubSubName과 topic을 제공해야 해요. 또는 미리 설정된 DaprPreviewClient를 Camel 레지스트리에 등록해서, 컨슈머가 내부에서 새로 만드는 대신 그 클라이언트를 재사용하게 할 수도 있어요.

2. configuration:

Apache Camel의 Dapr Configuration 컨슈머는 라우트가 Dapr가 지원하는 구성 스토어에서 실시간 업데이트를 받을 수 있게 해 줘요. 구성 스토어의 지정한 키 변경을 듣고, 업데이트를 Camel Exchange 객체로 처리해요.

컨슈머를 설정하려면 configStore 이름과 configKeys를 제공해야 해요.

예시 (Examples)

프로듀서 연산 예제 (Producer Operations Examples)

  • invokeService: 다른 애플리케이션의 메서드를 표준 HTTP 프로토콜로 호출해요.
from("direct:start")
    .setHeader("CamelDaprVerb", constant("GET"))
    .to("dapr:invokeService?serviceToInvoke=myService&methodToInvoke=myMethod")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelDaprVerb">
    <constant>GET</constant>
  </setHeader>
  <to uri="dapr:invokeService?serviceToInvoke=myService&amp;methodToInvoke=myMethod"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelDaprVerb
            constant: "GET"
        - to:
            uri: dapr:invokeService
            parameters:
              serviceToInvoke: myService
              methodToInvoke: myMethod
        - to:
            uri: mock:result
  • state: save: 상태 스토어에 키-값 쌍 하나를 저장해요.
from("direct:start")
    .setBody(constant("myValue"))
    .to("dapr:state?stateOperation=save&stateStore=myStore&key=myKey")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setBody>
    <constant>myValue</constant>
  </setBody>
  <to uri="dapr:state?stateOperation=save&amp;stateStore=myStore&amp;key=myKey"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setBody:
            constant: "myValue"
        - to:
            uri: dapr:state
            parameters:
              stateOperation: save
              stateStore: myStore
              key: myKey
        - to:
            uri: mock:result
  • state: saveBulk: 상태 스토어에 키-값 쌍 여러 개를 한 번에 저장해요.

자바 전용: Dapr SDK State 타입과 List.of()를 사용해 벌크 상태를 설정해요

from("direct:start")
    .process(exchange -> {
        State<String> state1 = new State<>("key1", "val1", "etag1");
        State<String> state2 = new State<>("key2", "val1", "etag2");
        List<State<?>> states = List.of(state1, state2);
        exchange.getMessage().setHeader("CamelDaprStates", states);
    })
    .to("dapr:state?stateOperation=saveBulk&stateStore=myStore")
    .to("mock:result");
  • state: get: 상태 스토어에서 특정 키의 값을 조회해요.
from("direct:start")
    .setHeader("CamelDaprConcurrency", constant("FIRST_WRITE"))
    .setHeader("CamelDaprConsistency", constant("EVENTUAL"))
    .to("dapr:state?stateOperation=get&stateStore=myStore&key=myKey")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelDaprConcurrency">
    <constant>FIRST_WRITE</constant>
  </setHeader>
  <setHeader name="CamelDaprConsistency">
    <constant>EVENTUAL</constant>
  </setHeader>
  <to uri="dapr:state?stateOperation=get&amp;stateStore=myStore&amp;key=myKey"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelDaprConcurrency
            constant: "FIRST_WRITE"
        - setHeader:
            name: CamelDaprConsistency
            constant: "EVENTUAL"
        - to:
            uri: dapr:state
            parameters:
              stateOperation: get
              stateStore: myStore
              key: myKey
        - to:
            uri: mock:result
  • state: getBulk: 상태 스토어에서 여러 키의 값을 한 번에 조회해요.

자바 전용: List.of()를 사용해 벌크 키 목록을 설정해요

from("direct:start")
    .process(exchange -> {
        exchange.getIn().setHeader("CamelDaprKeys", List.of("key1", "key2"));
    })
    .to("dapr:state?stateOperation=getBulk&stateStore=myStore")
    .to("mock:result");
  • state: delete: 상태 스토어에서 특정 키와 그 값을 삭제해요.

자바 전용: Map.of()를 사용해 메타데이터를 설정해요

from("direct:start")
    .process(exchange -> {
        exchange.getIn().setHeader("CamelDaprMetadata", Map.of("partitionKey", "myPartitionKey"));
    })
    .to("dapr:state?stateOperation=delete&stateStore=myStore&key=myKey")
    .to("mock:result");
  • state: executeTransaction: 여러 연산을 트랜잭션으로 원자적으로 실행해요.

자바 전용: Dapr SDK TransactionalStateOperation과 State 타입을 사용해요

from("direct:start")
    .process(exchange -> {
        TransactionalStateOperation.OperationType op = TransactionalStateOperation.OperationType.UPSERT;
        List<TransactionalStateOperation<?>> transactions = List.of(new TransactionalStateOperation<>(op, new State<>("myKey")));
        exchange.getIn().setHeader("CamelDaprTransactions", transactions);
    })
    .to("dapr:state?stateOperation=executeTransaction&stateStore=myStore")
    .to("mock:result");
  • pubSub: Pub/Sub 컴포넌트로 메시지를 퍼블리시해요.
from("direct:start")
    .setHeader("CamelDaprContentType", constant("application/json"))
    .to("dapr:pubSub?pubSubName=myPubSub&topic=myTopic")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelDaprContentType">
    <constant>application/json</constant>
  </setHeader>
  <to uri="dapr:pubSub?pubSubName=myPubSub&amp;topic=myTopic"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelDaprContentType
            constant: "application/json"
        - to:
            uri: dapr:pubSub
            parameters:
              pubSubName: myPubSub
              topic: myTopic
        - to:
            uri: mock:result
  • invokeBinding: 설정된 출력 바인딩으로 데이터를 보내요.
from("direct:start")
    .setBody(constant("myBody"))
    .to("dapr:invokeBinding?bindingName=myBinding&bindingOperation=myOperation")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setBody>
    <constant>myBody</constant>
  </setBody>
  <to uri="dapr:invokeBinding?bindingName=myBinding&amp;bindingOperation=myOperation"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setBody:
            constant: "myBody"
        - to:
            uri: dapr:invokeBinding
            parameters:
              bindingName: myBinding
              bindingOperation: myOperation
        - to:
            uri: mock:result
  • secret: 시크릿 스토어에서 시크릿을 조회해요.
from("direct:start")
  .to("dapr:secret?secretStore=myStore&key=mySecret")
  .log("Received secret from Dapr: ${body}")
  .to("mock:result");
<route>
  <from uri="direct:start"/>
  <to uri="dapr:secret?secretStore=myStore&amp;key=mySecret"/>
  <log message="Received secret from Dapr: ${body}"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - to:
            uri: dapr:secret
            parameters:
              secretStore: myStore
              key: mySecret
        - log: "Received secret from Dapr: ${body}"
        - to:
            uri: mock:result
  • secret: bulk: 키 없이 시크릿 스토어의 모든 시크릿을 한 번에 조회해요.
from("direct:start")
  // when no secret key is passed, bulk retrieval is performed on secret store
  .to("dapr:secret?secretStore=myStore")
  .log("Received bulk secrets from Dapr: ${body}")
  .to("mock:result");
<route>
  <from uri="direct:start"/>
  <to uri="dapr:secret?secretStore=myStore"/>
  <log message="Received bulk secrets from Dapr: ${body}"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - to:
            uri: dapr:secret
            parameters:
              secretStore: myStore
        - log: "Received bulk secrets from Dapr: ${body}"
        - to:
            uri: mock:result
  • configuration: 구성 스토어에서 구성 값을 조회해요.

자바 전용: List.of()를 사용해 구성 키 목록을 설정해요

from("direct:start")
    .process(exchange -> {
        exchange.getIn().setHeader("CamelDaprConfigKeys", List.of("k1", "k2"));
    })
    .to("dapr:configuration?configStore=myStore")
    .log("Received config updates from Dapr: ${body}")
    .to("mock:result");
  • lock: tryLock: 리소스에 분산 락 획득을 시도해요.
from("direct:start")
    .setHeader("CamelDaprResourceId", constant("myResource"))
    .to("dapr:lock?lockOperation=tryLock&storeName=myStore&expiryInSeconds=100")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelDaprResourceId">
    <constant>myResource</constant>
  </setHeader>
  <to uri="dapr:lock?lockOperation=tryLock&amp;storeName=myStore&amp;expiryInSeconds=100"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelDaprResourceId
            constant: "myResource"
        - to:
            uri: dapr:lock
            parameters:
              lockOperation: tryLock
              storeName: myStore
              expiryInSeconds: 100
        - to:
            uri: mock:result
  • lock: unlock: 이전에 획득한 락을 해제해요.
from("direct:start")
    .setHeader("CamelDaprResourceId", constant("myResource"))
    .to("dapr:lock?lockOperation=unlock&storeName=myStore")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelDaprResourceId">
    <constant>myResource</constant>
  </setHeader>
  <to uri="dapr:lock?lockOperation=unlock&amp;storeName=myStore"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelDaprResourceId
            constant: "myResource"
        - to:
            uri: dapr:lock
            parameters:
              lockOperation: unlock
              storeName: myStore
        - to:
            uri: mock:result
  • workflow: scheduleNew: 새 워크플로 인스턴스 실행을 예약해요.
from("direct:start")
    .setHeader("CamelDaprWorkflowClass", constant("my.package.MyWorkflow"))
    .to("dapr:workflow?workflowOperation=scheduleNew")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelDaprWorkflowClass">
    <constant>my.package.MyWorkflow</constant>
  </setHeader>
  <to uri="dapr:workflow?workflowOperation=scheduleNew"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelDaprWorkflowClass
            constant: "my.package.MyWorkflow"
        - to:
            uri: dapr:workflow
            parameters:
              workflowOperation: scheduleNew
        - to:
            uri: mock:result
  • workflow: terminate: 실행 중인 워크플로 인스턴스를 종료해요.
from("direct:start")
    .setHeader("CamelDaprWorkflowInstanceId", constant("myWorkflowInstanceId"))
    .to("dapr:workflow?workflowOperation=terminate")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelDaprWorkflowInstanceId">
    <constant>myWorkflowInstanceId</constant>
  </setHeader>
  <to uri="dapr:workflow?workflowOperation=terminate"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelDaprWorkflowInstanceId
            constant: "myWorkflowInstanceId"
        - to:
            uri: dapr:workflow
            parameters:
              workflowOperation: terminate
        - to:
            uri: mock:result
  • workflow: purge: 워크플로 인스턴스 메타데이터를 스토어에서 삭제해요.
from("direct:start")
    .setHeader("CamelDaprWorkflowInstanceId", constant("myWorkflowInstanceId"))
    .to("dapr:workflow?workflowOperation=purge")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelDaprWorkflowInstanceId">
    <constant>myWorkflowInstanceId</constant>
  </setHeader>
  <to uri="dapr:workflow?workflowOperation=purge"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelDaprWorkflowInstanceId
            constant: "myWorkflowInstanceId"
        - to:
            uri: dapr:workflow
            parameters:
              workflowOperation: purge
        - to:
            uri: mock:result
  • workflow: suspend: 실행 중인 워크플로 인스턴스를 일시 중지해요.
from("direct:start")
    .setHeader("CamelDaprWorkflowInstanceId", constant("myWorkflowInstanceId"))
    .setHeader("CamelDaprSuspendReason", constant("Suspended for maintenance."))
    .to("dapr:workflow?workflowOperation=suspend")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelDaprWorkflowInstanceId">
    <constant>myWorkflowInstanceId</constant>
  </setHeader>
  <setHeader name="CamelDaprSuspendReason">
    <constant>Suspended for maintenance.</constant>
  </setHeader>
  <to uri="dapr:workflow?workflowOperation=suspend"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelDaprWorkflowInstanceId
            constant: "myWorkflowInstanceId"
        - setHeader:
            name: CamelDaprSuspendReason
            constant: "Suspended for maintenance."
        - to:
            uri: dapr:workflow
            parameters:
              workflowOperation: suspend
        - to:
            uri: mock:result
  • workflow: resume: 일시 중지된 워크플로 인스턴스를 재개해요.
from("direct:start")
    .setHeader("CamelDaprWorkflowInstanceId", constant("myWorkflowInstanceId"))
    .setHeader("CamelDaprSuspendReason", constant("Maintenance complete."))
    .to("dapr:workflow?workflowOperation=resume")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelDaprWorkflowInstanceId">
    <constant>myWorkflowInstanceId</constant>
  </setHeader>
  <setHeader name="CamelDaprSuspendReason">
    <constant>Maintenance complete.</constant>
  </setHeader>
  <to uri="dapr:workflow?workflowOperation=resume"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelDaprWorkflowInstanceId
            constant: "myWorkflowInstanceId"
        - setHeader:
            name: CamelDaprSuspendReason
            constant: "Maintenance complete."
        - to:
            uri: dapr:workflow
            parameters:
              workflowOperation: resume
        - to:
            uri: mock:result
  • workflow: state: 워크플로 인스턴스의 현재 런타임 상태를 조회해요.
from("direct:start")
    .setHeader("CamelDaprWorkflowInstanceId", constant("myWorkflowInstanceId"))
    .to("dapr:workflow?workflowOperation=state")
    .log("Workflow state: ${body}")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelDaprWorkflowInstanceId">
    <constant>myWorkflowInstanceId</constant>
  </setHeader>
  <to uri="dapr:workflow?workflowOperation=state"/>
  <log message="Workflow state: ${body}"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelDaprWorkflowInstanceId
            constant: "myWorkflowInstanceId"
        - to:
            uri: dapr:workflow
            parameters:
              workflowOperation: state
        - log:
            message: "Workflow state: ${body}"
        - to:
            uri: mock:result
  • workflow: waitForInstanceStart: 워크플로 인스턴스가 시작되기를 기다려요.

자바 전용: Duration.ofSeconds()를 사용해 타임아웃을 설정해요

from("direct:start")
    .process(exchange -> {
        exchange.getIn().setHeader("CamelDaprWorkflowInstanceId", "myWorkflowInstanceId");
        exchange.getIn().setHeader("CamelDaprTimeout", Duration.ofSeconds(30));
    })
    .to("dapr:workflow?workflowOperation=waitForInstanceStart")
    .to("mock:result");
  • workflow: waitForInstanceCompletion: 워크플로 인스턴스가 완료되기를 기다려요.

자바 전용: Duration.ofSeconds()를 사용해 타임아웃을 설정해요

from("direct:start")
    .process(exchange -> {
        exchange.getIn().setHeader("CamelDaprWorkflowInstanceId", "myWorkflowInstanceId");
        exchange.getIn().setHeader("CamelDaprTimeout", Duration.ofSeconds(30));
    })
    .to("dapr:workflow?workflowOperation=waitForInstanceCompletion")
    .to("mock:result");
  • workflow: raiseEvent: 대기 중인 워크플로 인스턴스에 이벤트를 보내요.
from("direct:start")
    .setHeader("CamelDaprWorkflowInstanceId", constant("myWorkflowInstanceId"))
    .to("dapr:workflow?workflowOperation=raiseEvent&eventName=MyEvent")
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setHeader name="CamelDaprWorkflowInstanceId">
    <constant>myWorkflowInstanceId</constant>
  </setHeader>
  <to uri="dapr:workflow?workflowOperation=raiseEvent&amp;eventName=MyEvent"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:start
      steps:
        - setHeader:
            name: CamelDaprWorkflowInstanceId
            constant: "myWorkflowInstanceId"
        - to:
            uri: dapr:workflow
            parameters:
              workflowOperation: raiseEvent
              eventName: MyEvent
        - to:
            uri: mock:result

컨슈머 연산 예제 (Consumer Operations Examples)

  • pubSub: Pub/Sub 토픽을 구독해 이벤트를 소비해요.
from("dapr:pubSub?pubSubName=myPubSub&topic=myTopic")
  .log("Received message from Dapr pubsub: ${body}")
  .to("mock:result");
<route>
  <from uri="dapr:pubSub?pubSubName=myPubSub&amp;topic=myTopic"/>
  <log message="Received message from Dapr pubsub: ${body}"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: dapr:pubSub
      parameters:
        pubSubName: myPubSub
        topic: myTopic
      steps:
        - log: "Received message from Dapr pubsub: ${body}"
        - to:
            uri: mock:result
  • configuration: 구성 스토어의 키 변경을 구독해 실시간 업데이트를 받아요.
from("dapr:configuration?configStore=myStore&configKeys=k1,k2")
  .log("Received config updates from Dapr: ${body}")
  .to("mock:result");
<route>
  <from uri="dapr:configuration?configStore=myStore&amp;configKeys=k1,k2"/>
  <log message="Received config updates from Dapr: ${body}"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: dapr:configuration
      parameters:
        configStore: myStore
        configKeys: "k1,k2"
      steps:
        - log: "Received config updates from Dapr: ${body}"
        - to:
            uri: mock:result

더 알아보기 (Learn more)

각 연산의 실제 사용법은 위의 예시(Examples) 섹션의 자바/XML/YAML 예제부터 따라 해 보는 걸 추천해요.