| <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>gRPC :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/components/4.18.x/grpc-component.html"> <meta name="description" content="Expose gRPC endpoints and access external gRPC endpoints."> <meta name="generator" content="Antora 3.1.7"> <link rel="stylesheet" href="../../_/css/site-5c323c41e9.css"> <meta name="application-name" content="Apache Camel"> <meta property="og:title" content="gRPC"> <meta property="og:site_name" content="Apache Camel"> <meta property="og:url" content="https://camel.apache.org"> <meta property="og:description" content="Apache Camel is an open source integration framework with 350+ connectors for databases, APIs, message brokers, and cloud services. Write routes in Java, YAML, or XML. Run on Spring Boot, Quarkus, or standalone with the Camel CLI. In production since 2007. Apache License 2.0."> <meta property="og:type" content="website"> <meta property="og:image" content="https://camel.apache.org/_/img/logo-d-a567cee6fa.svg"> <link rel="manifest" href="../../site.webmanifest"> <link rel="apple-touch-icon-precomposed" sizes="57x57" href="../../apple-touch-icon-57x57.png"> <link rel="apple-touch-icon-precomposed" sizes="114x114" href="../../apple-touch-icon-114x114.png"> <link rel="apple-touch-icon-precomposed" sizes="72x72" href="../../apple-touch-icon-72x72.png"> <link rel="apple-touch-icon-precomposed" sizes="144x144" href="../../apple-touch-icon-144x144.png"> <link rel="apple-touch-icon-precomposed" sizes="60x60" href="../../apple-touch-icon-60x60.png"> <link rel="apple-touch-icon-precomposed" sizes="120x120" href="../../apple-touch-icon-120x120.png"> <link rel="apple-touch-icon-precomposed" sizes="76x76" href="../../apple-touch-icon-76x76.png"> <link rel="apple-touch-icon-precomposed" sizes="152x152" href="../../apple-touch-icon-152x152.png"> <link rel="icon" type="image/png" href="../../favicon-196x196.png" sizes="196x196"> <link rel="icon" type="image/png" href="../../favicon-96x96.png" sizes="96x96"> <link rel="icon" type="image/png" href="../../favicon-32x32.png" sizes="32x32"> <link rel="icon" type="image/png" href="../../favicon-16x16.png" sizes="16x16"> <link rel="icon" type="image/png" href="../../favicon-128.png" sizes="128x128"> </head> <body class="article"> <header class="header"> <nav class="navbar" aria-label="Main menu"> <div class="navbar-brand"> <a class="nav-logo" href="../.."></a> <div id="topbar-nav" class="navbar-menu"> <div class="navbar-end"> <a class="navbar-item-section navbar-item navbar-topics" href="../../blog/"> <img alt="Blog" src="/_/img/blog-4c7fa4cb60.svg"> Blog </a> <a class="navbar-item-section navbar-item navbar-topics" href="../../docs/"> <img alt="Documentation" src="/_/img/documentation-abb1b7f8b1.svg"> Documentation </a> <a class="navbar-item-section navbar-item navbar-topics" href="../../community/"> <img alt="Community" src="/_/img/community-2ec8a3dc8b.svg"> Community </a> <a class="navbar-item-section navbar-item navbar-topics" href="../../tooling/"> <img alt="Tooling" src="/_/img/tooling-f5e235c238.svg"> Tooling </a> <a class="navbar-item-section navbar-item navbar-topics" href="../../download/"> <img alt="Download" src="/_/img/download-63cdd75074.svg"> Download </a> <a class="navbar-item-section navbar-item navbar-topics" href="../../security/"> <img alt="Security" src="/_/img/security-06abe157b3.svg"> Security </a> <a class="navbar-item-section navbar-item navbar-topics" href="../../trust/"> <img alt="Trust" src="/_/img/security-06abe157b3.svg"> Trust </a> </div> </div> <div class="navbar-fill"></div> <div class="break-row"></div> <div class="navbar-search results-hidden"> <input id="search" class="search" placeholder="Search" autocomplete="off" maxlength="200"> <img src="../../_/img/cancel-1ed239489b.svg" alt="Clear" id="search-cancel"> <div id="search_results"></div> </div> <div class="navbar-tools"> <a rel="noopener noreferrer nofollow" href="https://github.com/apache/camel/" title="Collaborate on GitHub"><svg focusable="false" class="brand-icon"><use xlink:href="../../_/img/brand-logos-a2b35bbdec.svg#github"/></svg></a> <a rel="noopener noreferrer nofollow" href="https://camel.zulipchat.com" title="Chat on Zulip"><svg focusable="false" class="brand-icon"><use xlink:href="../../_/img/brand-logos-a2b35bbdec.svg#zulip"/></svg></a> <a rel="noopener noreferrer nofollow" href="https://twitter.com/ApacheCamel" title="Follow Apache Camel on Twitter"><svg focusable="false" class="brand-icon"><use xlink:href="../../_/img/brand-logos-a2b35bbdec.svg#twitter"/></svg></a> <a rel="noopener noreferrer nofollow" href="https://www.linkedin.com/groups/2447439/" title="Apache Camel group on Linkedin"><svg focusable="false" class="brand-icon"><use xlink:href="../../_/img/brand-logos-a2b35bbdec.svg#linkedin"/></svg></a> </div> <button class="navbar-burger" data-target="topbar-nav" type="button" aria-label="Menu"> <span></span> <span></span> <span></span> </button> </div> </nav> </header> <a id="top"></a> <div class="body"> <div class="nav-container" data-component="components" data-version="next"> <aside class="nav" aria-label="Side menu"> <div class="panels"> <div class="nav-panel-menu is-active"> <input class="search" placeholder="Quick lookup"> <nav class="nav-menu" data-panel="menu" aria-label="Topics"> <h3 class="title"><a href="index.html">Camel Components</a></h3> <ul class="nav-list"> <li class="nav-item" data-depth="0"> <ul class="nav-list"> <li class="nav-item" data-depth="1"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="index.html">Components</a> <ul class="nav-list"> <li class="nav-item" data-depth="2"> <a class="nav-link" href="activemq-component.html">ActiveMQ 5.x</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="activemq6-component.html">ActiveMQ 6.x</a> </li> <li class="nav-item" data-depth="2"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="ai-summary.html">AI</a> <ul class="nav-list"> <li class="nav-item" data-depth="3"> <a class="nav-link" href="a2a-component.html">A2A</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="ai-tool-component.html">AI Tool</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="chatscript-component.html">ChatScript</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="djl-component.html">Deep Java Library</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="docling-component.html">Docling</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="huggingface-component.html">Hugging Face</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="kserve-component.html">KServe</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="langchain4j-agent-component.html">LangChain4j Agent</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="langchain4j-chat-component.html">LangChain4j Chat</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="langchain4j-embeddingstore-component.html">LangChain4j Embedding Store</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="langchain4j-embeddings-component.html">LangChain4j Embeddings</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="langchain4j-tools-component.html">LangChain4j Tools</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="langchain4j-web-search-component.html">LangChain4j Web Search</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="milvus-component.html">Milvus</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="neo4j-component.html">Neo4j</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="openai-component.html">OpenAI</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="pgvector-component.html">PGVector</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="pinecone-component.html">Pinecone</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="qdrant-component.html">Qdrant</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="spring-ai-chat-component.html">Spring AI Chat</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="spring-ai-embeddings-component.html">Spring AI Embeddings</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="spring-ai-image-component.html">Spring AI Image</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="spring-ai-tools-component.html">Spring AI Tools</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="spring-ai-vector-store-component.html">Spring AI Vector Store</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="tensorflow-serving-component.html">TensorFlow Serving</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="weaviate-component.html">weaviate</a> </li> </ul> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="amqp-component.html">AMQP</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="arangodb-component.html">ArangoDb</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="as2-component.html">AS2</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="asterisk-component.html">Asterisk</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="atmosphere-websocket-component.html">Atmosphere Websocket</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="atom-component.html">Atom</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="avro-component.html">Avro RPC</a> </li> <li class="nav-item" data-depth="2"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="aws-summary.html">AWS</a> <ul class="nav-list"> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-athena-component.html">AWS Athena</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws-bedrock-component.html">AWS Bedrock</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws-bedrock-agent-component.html">AWS Bedrock Agent</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws-bedrock-agent-runtime-component.html">AWS Bedrock Agent Runtime</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws-cloudtrail-component.html">AWS CloudTrail</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-cw-component.html">AWS CloudWatch</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-comprehend-component.html">AWS Comprehend</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws-config-component.html">AWS Config Service</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-ddb-component.html">AWS DynamoDB</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-ddbstream-component.html">AWS DynamoDB Streams</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-ec2-component.html">AWS Elastic Compute Cloud (EC2)</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-ecs-component.html">AWS Elastic Container Service (ECS)</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-eks-component.html">AWS Elastic Kubernetes Service (EKS)</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-eventbridge-component.html">AWS Eventbridge</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-iam-component.html">AWS Identity and Access Management (IAM)</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-kms-component.html">AWS Key Management Service (KMS)</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-kinesis-component.html">AWS Kinesis</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-kinesis-firehose-component.html">AWS Kinesis Firehose</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-lambda-component.html">AWS Lambda</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-msk-component.html">AWS Managed Streaming for Apache Kafka (MSK)</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-mq-component.html">AWS MQ</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws-parameter-store-component.html">AWS Parameter Store</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-polly-component.html">AWS Polly</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-redshift-data-component.html">AWS RedshiftData</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-rekognition-component.html">AWS Rekognition</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-s3-component.html">AWS S3 Storage Service</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-s3-vectors-component.html">AWS S3 Vectors</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws-secrets-manager-component.html">AWS Secrets Manager</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws-security-hub-component.html">AWS Security Hub</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-sts-component.html">AWS Security Token Service (STS)</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-ses-component.html">AWS Simple Email Service (SES)</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-sns-component.html">AWS Simple Notification System (SNS)</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-sqs-component.html">AWS Simple Queue Service (SQS)</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-step-functions-component.html">AWS StepFunctions</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-textract-component.html">AWS Textract</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-timestream-component.html">AWS Timestream</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-transcribe-component.html">AWS Transcribe</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="aws2-translate-component.html">AWS Translate</a> </li> </ul> </li> <li class="nav-item" data-depth="2"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="azure-summary.html">Azure</a> <ul class="nav-list"> <li class="nav-item" data-depth="3"> <a class="nav-link" href="azure-cosmosdb-component.html">Azure CosmosDB</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="azure-eventgrid-component.html">Azure Event Grid</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="azure-eventhubs-component.html">Azure Event Hubs</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="azure-files-component.html">Azure Files</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="azure-functions-component.html">Azure Functions</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="azure-key-vault-component.html">Azure Key Vault</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="azure-servicebus-component.html">Azure ServiceBus</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="azure-storage-blob-component.html">Azure Storage Blob Service</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="azure-storage-datalake-component.html">Azure Storage Data Lake Service</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="azure-storage-queue-component.html">Azure Storage Queue Service</a> </li> </ul> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="bean-component.html">Bean</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="bean-validator-component.html">Bean Validator</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="bonita-component.html">Bonita</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="box-component.html">Box</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="braintree-component.html">Braintree</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="browse-component.html">Browse</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="caffeine-cache-component.html">Caffeine Cache</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="caffeine-loadcache-component.html">Caffeine LoadCache</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="camunda-component.html">Camunda</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="cql-component.html">Cassandra CQL</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="chunk-component.html">Chunk</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="class-component.html">Class</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="clickhouse-component.html">ClickHouse</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="clickup-component.html">ClickUp</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="cm-sms-component.html">CM SMS Gateway</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="coap-component.html">CoAP</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="cometd-component.html">CometD</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="consul-component.html">Consul</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="controlbus-component.html">Control Bus</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="couchbase-component.html">Couchbase</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="couchdb-component.html">CouchDB</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="cron-component.html">Cron</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="crypto-component.html">Crypto (JCE)</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="cxf-component.html">CXF</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="cxfrs-component.html">CXF-RS</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="cyberark-vault-component.html">CyberArk Vault</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dapr-component.html">Dapr</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformat-component.html">Data Format</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataset-component.html">Dataset</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataset-test-component.html">DataSet Test</a> </li> <li class="nav-item" data-depth="2"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="debezium-summary.html">Debezium</a> <ul class="nav-list"> <li class="nav-item" data-depth="3"> <a class="nav-link" href="debezium-db2-component.html">Debezium DB2 Connector</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="debezium-mongodb-component.html">Debezium MongoDB Connector</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="debezium-mysql-component.html">Debezium MySQL Connector</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="debezium-oracle-component.html">Debezium Oracle Connector</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="debezium-postgres-component.html">Debezium PostgreSQL Connector</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="debezium-sqlserver-component.html">Debezium SQL Server Connector</a> </li> </ul> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dfdl-component.html">DFDL</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dhis2-component.html">DHIS2</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="digitalocean-component.html">DigitalOcean</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="direct-component.html">Direct</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="disruptor-component.html">Disruptor</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="disruptor-vm-component.html">Disruptor VM</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dns-component.html">DNS</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="docker-component.html">Docker</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="drill-component.html">Drill</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dropbox-component.html">Dropbox</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="duckdb-component.html">DuckDB</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dynamic-router-component.html">Dynamic Router</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dynamic-router-control-component.html">Dynamic Router Control</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="ehcache-component.html">Ehcache</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="elasticsearch-component.html">Elasticsearch</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="elasticsearch-rest-client-component.html">Elasticsearch Low level Rest Client</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="event-component.html">Event</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="exec-component.html">Exec</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="fhir-component.html">FHIR</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="file-component.html">File</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="file-watch-component.html">File Watch</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="flatpack-component.html">Flatpack</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="flink-component.html">Flink</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="flowable-component.html">Flowable</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="fop-component.html">FOP</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="freemarker-component.html">Freemarker</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="ftp-component.html">FTP</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="ftps-component.html">FTPS</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="geocoder-component.html">Geocoder</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="git-component.html">Git</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="github2-component.html">GitHub2</a> </li> <li class="nav-item" data-depth="2"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="google-summary.html">Google</a> <ul class="nav-list"> <li class="nav-item" data-depth="3"> <a class="nav-link" href="google-bigquery-component.html">Google BigQuery</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="google-bigquery-sql-component.html">Google BigQuery Standard SQL</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="google-calendar-component.html">Google Calendar</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="google-calendar-stream-component.html">Google Calendar Stream</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="google-functions-component.html">Google Cloud Functions</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="google-speech-to-text-component.html">Google Cloud Speech To Text</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="google-text-to-speech-component.html">Google Cloud Text To Speech</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="google-vision-component.html">Google Cloud Vision</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="google-drive-component.html">Google Drive</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="google-firestore-component.html">Google Firestore</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="google-mail-component.html">Google Mail</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="google-mail-stream-component.html">Google Mail Stream</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="google-pubsub-component.html">Google Pubsub</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="google-secret-manager-component.html">Google Secret Manager</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="google-sheets-component.html">Google Sheets</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="google-sheets-stream-component.html">Google Sheets Stream</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="google-storage-component.html">Google Storage</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="google-vertexai-component.html">Google Vertex AI</a> </li> </ul> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="graphql-component.html">GraphQL</a> </li> <li class="nav-item is-current-page" data-depth="2"> <a class="nav-link" href="grpc-component.html">gRPC</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="hashicorp-vault-component.html">HashiCorp Vault</a> </li> <li class="nav-item" data-depth="2"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="hazelcast-summary.html">Hazelcast</a> <ul class="nav-list"> <li class="nav-item" data-depth="3"> <a class="nav-link" href="hazelcast-atomicvalue-component.html">Hazelcast Atomic Number</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="hazelcast-instance-component.html">Hazelcast Instance</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="hazelcast-list-component.html">Hazelcast List</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="hazelcast-map-component.html">Hazelcast Map</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="hazelcast-multimap-component.html">Hazelcast Multimap</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="hazelcast-pncounter-component.html">Hazelcast PN Counter</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="hazelcast-queue-component.html">Hazelcast Queue</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="hazelcast-replicatedmap-component.html">Hazelcast Replicated Map</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="hazelcast-ringbuffer-component.html">Hazelcast Ringbuffer</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="hazelcast-seda-component.html">Hazelcast SEDA</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="hazelcast-set-component.html">Hazelcast Set</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="hazelcast-topic-component.html">Hazelcast Topic</a> </li> </ul> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="http-component.html">HTTP</a> </li> <li class="nav-item" data-depth="2"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="hwcloud-summary.html">Huawei Cloud</a> <ul class="nav-list"> <li class="nav-item" data-depth="3"> <a class="nav-link" href="hwcloud-frs-component.html">Huawei Cloud Face Recognition Service (FRS)</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="hwcloud-imagerecognition-component.html">Huawei Cloud Image Recognition</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="hwcloud-dms-component.html">Huawei Distributed Message Service (DMS)</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="hwcloud-functiongraph-component.html">Huawei FunctionGraph</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="hwcloud-iam-component.html">Huawei Identity and Access Management (IAM)</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="hwcloud-obs-component.html">Huawei Object Storage Service (OBS)</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="hwcloud-smn-component.html">Huawei Simple Message Notification (SMN)</a> </li> </ul> </li> <li class="nav-item" data-depth="2"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="ibm-summary.html">IBM</a> <ul class="nav-list"> <li class="nav-item" data-depth="3"> <a class="nav-link" href="ibm-cos-component.html">IBM Cloud Object Storage</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="ibm-secrets-manager-component.html">IBM Secrets Manager</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="ibm-watson-discovery-component.html">IBM Watson Discovery</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="ibm-watson-language-component.html">IBM Watson Language</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="ibm-watson-speech-to-text-component.html">IBM Watson Speech to Text</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="ibm-watson-text-to-speech-component.html">IBM Watson Text to Speech</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="ibm-watsonx-ai-component.html">IBM watsonx.ai</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="ibm-watsonx-data-component.html">IBM watsonx.data</a> </li> </ul> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="iec60870-client-component.html">IEC 60870 Client</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="iec60870-server-component.html">IEC 60870 Server</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="iggy-component.html">Iggy</a> </li> <li class="nav-item" data-depth="2"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="ignite-summary.html">Ignite</a> <ul class="nav-list"> <li class="nav-item" data-depth="3"> <a class="nav-link" href="ignite-cache-component.html">Ignite Cache</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="ignite-compute-component.html">Ignite Compute</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="ignite-events-component.html">Ignite Events</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="ignite-idgen-component.html">Ignite ID Generator</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="ignite-messaging-component.html">Ignite Messaging</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="ignite-queue-component.html">Ignite Queues</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="ignite-set-component.html">Ignite Sets</a> </li> </ul> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="infinispan-component.html">Infinispan</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="infinispan-embedded-component.html">Infinispan Embedded</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="influxdb-component.html">InfluxDB</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="influxdb2-component.html">InfluxDB2</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="irc-component.html">IRC</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="ironmq-component.html">IronMQ</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="jcache-component.html">JCache</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="jcr-component.html">JCR</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="jdbc-component.html">JDBC</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="jetty-component.html">Jetty</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="jgroups-component.html">JGroups</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="jgroups-raft-component.html">JGroups raft</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="jira-component.html">Jira</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="jms-component.html">JMS</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="jmx-component.html">JMX</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="jolt-component.html">JOLT</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="jooq-component.html">JOOQ</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="jpa-component.html">JPA</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="jslt-component.html">JSLT</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="json-validator-component.html">JSON Schema Validator</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="jsonata-component.html">JSONata</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="json-patch-component.html">JsonPatch</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="jt400-component.html">JT400</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="jte-component.html">JTE</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="kafka-component.html">Kafka</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="kamelet-component.html">Kamelet</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="keycloak-component.html">Keycloak</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="knative-component.html">Knative</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="knative-http-component.html">Knative Http</a> </li> <li class="nav-item" data-depth="2"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="kubernetes-summary.html">Kubernetes</a> <ul class="nav-list"> <li class="nav-item" data-depth="3"> <a class="nav-link" href="kubernetes-config-maps-component.html">Kubernetes ConfigMap</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="kubernetes-cronjob-component.html">Kubernetes Cronjob</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="kubernetes-custom-resources-component.html">Kubernetes Custom Resources</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="kubernetes-deployments-component.html">Kubernetes Deployments</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="kubernetes-events-component.html">Kubernetes Event</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="kubernetes-hpa-component.html">Kubernetes HPA</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="kubernetes-job-component.html">Kubernetes Job</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="kubernetes-namespaces-component.html">Kubernetes Namespaces</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="kubernetes-nodes-component.html">Kubernetes Nodes</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="kubernetes-persistent-volumes-component.html">Kubernetes Persistent Volume</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="kubernetes-persistent-volumes-claims-component.html">Kubernetes Persistent Volume Claim</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="kubernetes-pods-component.html">Kubernetes Pods</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="kubernetes-replication-controllers-component.html">Kubernetes Replication Controller</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="kubernetes-resources-quota-component.html">Kubernetes Resources Quota</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="kubernetes-secrets-component.html">Kubernetes Secrets</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="kubernetes-service-accounts-component.html">Kubernetes Service Account</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="kubernetes-services-component.html">Kubernetes Services</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="openshift-build-configs-component.html">OpenShift Build Config</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="openshift-builds-component.html">OpenShift Builds</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="openshift-deploymentconfigs-component.html">OpenShift Deployment Configs</a> </li> </ul> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="kudu-component.html">Kudu</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="language-component.html">Language</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="ldap-component.html">LDAP</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="ldif-component.html">LDIF</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="log-component.html">Log Data</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="lucene-component.html">Lucene</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="lumberjack-component.html">Lumberjack</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="mail-component.html">Mail</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="mapstruct-component.html">MapStruct</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="master-component.html">Master</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="metrics-component.html">Metrics</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="micrometer-component.html">Micrometer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="mina-component.html">Mina</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="mina-sftp-component.html">MINA SFTP</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="minio-component.html">Minio</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="mllp-component.html">MLLP</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="mock-component.html">Mock</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="mongodb-component.html">MongoDB</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="mongodb-gridfs-component.html">MongoDB GridFS</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="mustache-component.html">Mustache</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="mvel-component.html">MVEL</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="mybatis-component.html">MyBatis</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="mybatis-bean-component.html">MyBatis Bean</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="nats-component.html">Nats</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="netty-component.html">Netty</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="netty-http-component.html">Netty HTTP</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="oaipmh-component.html">OAI-PMH</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="olingo2-component.html">Olingo2</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="olingo4-component.html">Olingo4</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="once-component.html">Once</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="milo-browse-component.html">OPC UA Browser</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="milo-client-component.html">OPC UA Client</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="milo-server-component.html">OPC UA Server</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="opensearch-component.html">OpenSearch</a> </li> <li class="nav-item" data-depth="2"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="openstack-summary.html">OpenStack</a> <ul class="nav-list"> <li class="nav-item" data-depth="3"> <a class="nav-link" href="openstack-cinder-component.html">OpenStack Cinder</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="openstack-glance-component.html">OpenStack Glance</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="openstack-keystone-component.html">OpenStack Keystone</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="openstack-neutron-component.html">OpenStack Neutron</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="openstack-nova-component.html">OpenStack Nova</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="openstack-swift-component.html">OpenStack Swift</a> </li> </ul> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="opentelemetry-metrics-component.html">OpenTelemetry Metrics</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="optaplanner-component.html">OptaPlanner</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="paho-component.html">Paho</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="paho-mqtt5-component.html">Paho MQTT 5</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="pdf-component.html">PDF</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="platform-http-component.html">Platform HTTP</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="plc4x-component.html">PLC4X</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="pgevent-component.html">PostgreSQL Event</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="pg-replication-slot-component.html">PostgreSQL Replication Slot</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="pqc-component.html">PQC Algorithms</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="lpr-component.html">Printer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="properties-component.html">Properties</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="pubnub-component.html">PubNub</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="pulsar-component.html">Pulsar</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="quartz-component.html">Quartz</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="quickfix-component.html">QuickFix</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="reactive-streams-component.html">Reactive Streams</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="ref-component.html">Ref</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="rest-component.html">REST</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="rest-api-component.html">REST API</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="rest-openapi-component.html">REST OpenApi</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="robotframework-component.html">Robot Framework</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="rocketmq-component.html">RocketMQ</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="rss-component.html">RSS</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="saga-component.html">Saga</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="salesforce-component.html">Salesforce</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="sap-netweaver-component.html">SAP NetWeaver</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="scheduler-component.html">Scheduler</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="schematron-component.html">Schematron</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="scp-component.html">SCP</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="seda-component.html">SEDA</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="servicenow-component.html">ServiceNow</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="servlet-component.html">Servlet</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="sftp-component.html">SFTP</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="shell-component.html">Shell</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="sjms-component.html">Simple JMS</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="sjms2-component.html">Simple JMS2</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="slack-component.html">Slack</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="smb-component.html">SMB</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="smooks-component.html">Smooks</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="smpp-component.html">SMPP</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="snmp-component.html">SNMP</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="solr-component.html">Solr</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="splunk-component.html">Splunk</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="splunk-hec-component.html">Splunk HEC</a> </li> <li class="nav-item" data-depth="2"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="spring-summary.html">Spring</a> <ul class="nav-list"> <li class="nav-item" data-depth="3"> <a class="nav-link" href="spring-batch-component.html">Spring Batch</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="spring-event-component.html">Spring Event</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="spring-jdbc-component.html">Spring JDBC</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="spring-ldap-component.html">Spring LDAP</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="spring-rabbitmq-component.html">Spring RabbitMQ</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="spring-redis-component.html">Spring Redis</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="spring-ws-component.html">Spring WebService</a> </li> </ul> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="sql-component.html">SQL</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="sql-stored-component.html">SQL Stored Procedure</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="ssh-component.html">SSH</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="stax-component.html">StAX</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="stitch-component.html">Stitch</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="stream-component.html">Stream</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="string-template-component.html">String Template</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="stripe-component.html">Stripe</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="stub-component.html">Stub</a> </li> <li class="nav-item" data-depth="2"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="tahu-summary.html">Tahu</a> <ul class="nav-list"> <li class="nav-item" data-depth="3"> <a class="nav-link" href="tahu-edge-component.html">Tahu Edge Node / Device</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="tahu-host-component.html">Tahu Host Application</a> </li> </ul> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="telegram-component.html">Telegram</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="thrift-component.html">Thrift</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="thymeleaf-component.html">Thymeleaf</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="tika-component.html">Tika</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="timer-component.html">Timer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="twilio-component.html">Twilio</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="twitter-directmessage-component.html">Twitter Direct Message</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="twitter-search-component.html">Twitter Search</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="twitter-timeline-component.html">Twitter Timeline</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="undertow-component.html">Undertow</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="validator-component.html">Validator</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="velocity-component.html">Velocity</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="vertx-component.html">Vert.x</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="vertx-http-component.html">Vert.x HTTP Client</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="vertx-websocket-component.html">Vert.x WebSocket</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="wasm-component.html">Wasm</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="weather-component.html">Weather</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="web3j-component.html">Web3j Ethereum Blockchain</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="webhook-component.html">Webhook</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="whatsapp-component.html">WhatsApp</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="wordpress-component.html">WordPress</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="workday-component.html">Workday</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="xchange-component.html">XChange</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="xj-component.html">XJ</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="xmlsecurity-sign-component.html">XML Security Sign</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="xmlsecurity-verify-component.html">XML Security Verify</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="xmpp-component.html">XMPP</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="xquery-component.html">XQuery</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="xslt-component.html">XSLT</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="xslt-saxon-component.html">XSLT Saxon</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="zeebe-component.html">Zeebe</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="zendesk-component.html">Zendesk</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="zookeeper-component.html">ZooKeeper</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="zookeeper-master-component.html">ZooKeeper Master</a> </li> </ul> </li> </ul> </li> <li class="nav-item" data-depth="0"> <ul class="nav-list"> <li class="nav-item" data-depth="1"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="dataformats/index.html">Data Formats</a> <ul class="nav-list"> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/asn1-dataformat.html">ASN.1 File</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/avro-dataformat.html">Avro</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/avroJackson2-dataformat.html">Avro Jackson 2</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/avroJackson3-dataformat.html">Avro Jackson 3</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/barcode-dataformat.html">Barcode</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/base64-dataformat.html">Base64</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/beanio-dataformat.html">BeanIO</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/bindy-dataformat.html">Bindy</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/cbor-dataformat.html">CBOR</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/crypto-dataformat.html">Crypto (Java Cryptographic Extension)</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/csv-dataformat.html">CSV</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/dfdl-dataformat.html">DFDL</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/fhirJson-dataformat.html">FHIR JSon</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/fhirXml-dataformat.html">FHIR XML</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/flatpack-dataformat.html">Flatpack</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/fory-dataformat.html">Fory</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/grok-dataformat.html">Grok</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/groovyJson-dataformat.html">Groovy JSon</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/groovyXml-dataformat.html">Groovy XML</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/gzipDeflater-dataformat.html">GZip Deflater</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/hl7-dataformat.html">HL7</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/ical-dataformat.html">iCal</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/iso8583-dataformat.html">ISO-8583</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/jacksonXml2-dataformat.html">Jackson XML 2</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/jacksonXml3-dataformat.html">Jackson XML 3</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/jaxb-dataformat.html">JAXB</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/fastjson-dataformat.html">JSON Fastjson</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/gson-dataformat.html">JSON Gson</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/jackson2-dataformat.html">JSON Jackson 2</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/jackson3-dataformat.html">JSON Jackson 3</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/jsonb-dataformat.html">JSON JSON-B</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/jsonApi-dataformat.html">JSonApi</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/lzf-dataformat.html">LZF Deflate Compression</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/mimeMultipart-dataformat.html">MIME Multipart</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/ocsf-dataformat.html">OCSF</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/parquetAvro-dataformat.html">Parquet File</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/pgp-dataformat.html">PGP (Pretty Good Privacy Cryptographic)</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/pqc-dataformat.html">PQC (Post-Quantum Cryptography)</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/protobuf-dataformat.html">Protobuf</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/protobufJackson2-dataformat.html">Protobuf Jackson 2</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/protobufJackson3-dataformat.html">Protobuf Jackson 3</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/rss-dataformat.html">RSS</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/smooks-dataformat.html">Smooks</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/soap-dataformat.html">SOAP</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/swiftMt-dataformat.html">SWIFT MT</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/swiftMx-dataformat.html">SWIFT MX</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/syslog-dataformat.html">Syslog</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/tarFile-dataformat.html">Tar File</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/thrift-dataformat.html">Thrift</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/univocityCsv-dataformat.html">uniVocity CSV</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/univocityFixed-dataformat.html">uniVocity Fixed Length</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/univocityTsv-dataformat.html">uniVocity TSV</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/xmlSecurity-dataformat.html">XML Security</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/snakeYaml-dataformat.html">YAML SnakeYAML</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/zipDeflater-dataformat.html">Zip Deflater</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformats/zipFile-dataformat.html">Zip File</a> </li> </ul> </li> </ul> </li> <li class="nav-item" data-depth="0"> <ul class="nav-list"> <li class="nav-item" data-depth="1"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="languages/index.html">Languages</a> <ul class="nav-list"> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/bean-language.html">Bean Method</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/constant-language.html">Constant</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/csimple-language.html">CSimple</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/datasonnet-language.html">DataSonnet</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/exchangeProperty-language.html">ExchangeProperty</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/file-language.html">File</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/groovy-language.html">Groovy</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/header-language.html">Header</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/hl7terser-language.html">HL7 Terser</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/jactl-language.html">Jactl</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/java-language.html">Java</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/js-language.html">JavaScript</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/joor-language.html">jOOR</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/jq-language.html">JQ</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/jsonpath-language.html">JSONPath</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/mvel-language.html">MVEL</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/ognl-language.html">OGNL</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/python-language.html">Python</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/ref-language.html">Ref</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/simple-language.html">Simple</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/simple-advanced.html">Simple - Advanced Features</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/simple-functions.html">Simple - Built-in Functions</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/simple-operators.html">Simple - Built-in Operators</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/simple-ognl.html">Simple - OGNL Expressions</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/spel-language.html">SpEL</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/tokenize-language.html">Tokenize</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/variable-language.html">Variable</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/wasm-language.html">Wasm</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/xtokenize-language.html">XML Tokenize</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/xpath-language.html">XPath</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/xquery-language.html">XQuery</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/simple-advanced.html">Simple - Advanced Features</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/simple-functions.html">Simple - Built-in Functions</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/simple-ognl.html">Simple - OGNL Expressions</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages/simple-operators.html">Simple - Built-in Operators</a> </li> </ul> </li> </ul> </li> <li class="nav-item" data-depth="0"> <ul class="nav-list"> <li class="nav-item" data-depth="1"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="others/index.html">Miscellaneous Components</a> <ul class="nav-list"> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/a2a-consumer.html">A2A - Consumer Guide</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/a2a-producer.html">A2A - Producer Guide</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/attachments.html">Attachments</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/aws-bedrock-examples.html">AWS Bedrock - Examples</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/aws-bedrock-models.html">AWS Bedrock - Supported Models</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/aws2-s3-consumer-examples.html">AWS S3 - Consumer Examples</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/aws2-s3-producer-operations.html">AWS S3 - Producer Operations</a> </li> <li class="nav-item" data-depth="2"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="others/aws2-s3-streaming.html">AWS S3 - Streaming Upload</a> <ul class="nav-list"> <li class="nav-item" data-depth="3"> <a class="nav-link" href="others/azure-schema-registry.html">Azure Schema Registry</a> </li> </ul> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/azure-storage-blob-consumer.html">Azure Storage Blob - Consumer Examples</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/azure-storage-blob-operations.html">Azure Storage Blob - Producer Operations</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/camel-yaml-dsl-validator-maven-plugin.html">Camel YAML DSL Validator Maven Plugin</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/cli-connector.html">CLI Connector</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/cli-debug.html">CLI Debug</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/cloudevents.html">Cloudevents</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/csimple-joor.html">CSimple jOOR</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/cxf-transport.html">CXF Transport</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/debug.html">Debug</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/diagram.html">Diagram</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/docling-async-processing.html">Docling - Asynchronous Processing</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/docling-batch-processing.html">Docling - Batch Processing</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/docling-serve.html">Docling - Using Docling-Serve API</a> </li> <li class="nav-item" data-depth="2"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="others/dsl.html">DSL</a> <ul class="nav-list"> <li class="nav-item" data-depth="3"> <a class="nav-link" href="others/dsl-modeline.html">DSL Modeline</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="others/java-joor-dsl.html">Java DSL (runtime compiled)</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="others/java-xml-jaxb-dsl.html">Jaxb XML Dsl</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="others/kamelet-main.html">Kamelet Main</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="others/kamelet-main-support.html">Kamelet Main Support</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="others/java-xml-io-dsl.html">XML Io Dsl</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="others/yaml-dsl.html">YAML DSL</a> </li> </ul> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/headersmap.html">Headersmap</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/ibm-watsonx-ai-examples.html">IBM watsonx.ai - Examples</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/jandex.html">Jandex</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/jasypt.html">Jasypt</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/jfr.html">JFR</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/jsoup.html">Jsoup</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/jta.html">JTA</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/keycloak-consumer.html">Keycloak Consumer Operations</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/keycloak-producer.html">Keycloak Producer Operations</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/keycloak-security.html">Keycloak Security Policies</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/langchain4j-agent-guardrails.html">LangChain4j Agent - Input and Output Guardrails</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/langchain4j-agent-mcp.html">LangChain4j Agent - MCP Tools Integration</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/langchain4j-agent-multimodal.html">LangChain4j Agent - Multimodal Content Support</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/langchain4j-tokenizer.html">LangChain4j Tokenizer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/leveldb.html">LevelDB</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/lra.html">LRA</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/mail-microsoft-oauth.html">Mail Microsoft Oauth</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/main.html">Main</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/mdc.html">MDC Logging</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/observation.html">Micrometer Observability</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/micrometer-observability.html">Micrometer Observability 2</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/micrometer-prometheus.html">Micrometer Prometheus</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/microprofile-config.html">Microprofile Config</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/microprofile-fault-tolerance.html">Microprofile Fault Tolerance</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/microprofile-health.html">Microprofile Health</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/mina-sftp-authentication.html">MINA SFTP Authentication</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/mina-sftp-migration.html">MINA SFTP Migration from JSch</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/mina-sftp-security.html">MINA SFTP SSH Security</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/oauth.html">Oauth</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/observability-services.html">Observability Services</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/openai-providers.html">OpenAI - Compatible Providers</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/openai-operations.html">OpenAI - Embeddings and Audio Operations</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/openai-mcp.html">OpenAI - MCP Tool Calling</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/openapi-java.html">Openapi Java</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/openapi-validator.html">Openapi Validator</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/opentelemetry.html">OpenTelemetry</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/opentelemetry2.html">Opentelemetry2</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/platform-http-jolokia.html">Platform HTTP Jolokia</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/platform-http-main.html">Platform Http Main</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/platform-http-vertx.html">Platform Http Vertx</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/pqc-hybrid.html">PQC Hybrid Cryptography</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/pqc-key-lifecycle.html">PQC Key Lifecycle Management</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/reactive-executor-tomcat.html">Reactive Executor Tomcat</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/reactive-executor-vertx.html">Reactive Executor Vert.x</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/reactor.html">Reactor</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/redis.html">Redis</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/resilience4j.html">Resilience4j</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/resilience4j-micrometer.html">Resilience4j Micrometer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/resourceresolver-github.html">Resourceresolver Github</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/rxjava.html">RxJava</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/salesforce-bulk-api.html">Salesforce - Bulk API</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/salesforce-reports.html">Salesforce - Reports API</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/salesforce-rest-api.html">Salesforce - REST API</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/salesforce-streaming.html">Salesforce - Streaming and Pub/Sub</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/shiro.html">Shiro</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/spring-cloud-config.html">Spring Cloud Config</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/spring-main.html">Spring Main</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/spring-security.html">Spring Security</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/spring-xml.html">Spring XML</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/springdoc.html">Springdoc</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/telemetry.html">Telemetry</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/telemetry-dev.html">Telemetry Dev</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/test-junit5.html">Test JUnit5</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/test-junit6.html">Test JUnit6</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/test-main-junit5.html">Test Main JUnit5</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/test-main-junit6.html">Test Main JUnit6</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/test-spring-junit5.html">Test Spring JUnit5</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/test-spring-junit6.html">Test Spring JUnit6</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/threadpoolfactory-vertx.html">ThreadPoolFactory Vert.x</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/tracing.html">Tracing</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/undertow-spring-security.html">Undertow Spring Security</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="others/wal.html">Write Ahead Log Strategy for Resume API</a> </li> </ul> </li> </ul> </li> <li class="nav-item" data-depth="0"> <ul class="nav-list"> <li class="nav-item" data-depth="1"> <a class="nav-link" href="eips/enterprise-integration-patterns.html">Enterprise Integration Patterns</a> </li> <li class="nav-item" data-depth="1"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="eips/ai-patterns.html">AI Patterns</a> <ul class="nav-list"> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/a2aSubTask-eip.html">A2A Sub Task</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/aggregate-eip.html">Aggregate</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/batchConfig-eip.html">BatchConfig</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/bean-eip.html">Bean</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/change-data-capture.html">Change Data Capture</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/channel-adapter.html">Channel Adapter</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/choice-eip.html">Choice</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/circuitBreaker-eip.html">Circuit Breaker</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/claimCheck-eip.html">Claim Check</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/competing-consumers.html">Competing Consumers</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/composed-message-processor.html">Composed Message Processor</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/content-enricher.html">Content Enricher</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/content-filter-eip.html">Content Filter</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/convertBodyTo-eip.html">Convert Body To</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/convertHeaderTo-eip.html">Convert Header To</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/convertVariableTo-eip.html">Convert Variable To</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/correlation-identifier.html">Correlation Identifier</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/customLoadBalancer-eip.html">Custom Load Balancer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/dead-letter-channel.html">Dead Letter Channel</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/delay-eip.html">Delay</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/doTry-eip.html">Do Try</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/durable-subscriber.html">Durable Subscriber</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/dynamicRouter-eip.html">Dynamic Router</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/enrich-eip.html">Enrich</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/eventDrivenConsumer-eip.html">Event Driven Consumer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/event-message.html">Event Message</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/failoverLoadBalancer-eip.html">Failover Load Balancer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/faultToleranceConfiguration-eip.html">Fault Tolerance Configuration</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/fault-tolerance-eip.html">Fault Tolerance EIP</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/filter-eip.html">Filter</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/from-eip.html">From</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/guaranteed-delivery.html">Guaranteed Delivery</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/idempotentConsumer-eip.html">Idempotent Consumer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/intercept.html">Intercept</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/kamelet-eip.html">Kamelet</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/loadBalance-eip.html">Load Balance</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/log-eip.html">Logger</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/loop-eip.html">Loop</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/marshal-eip.html">Marshal</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/message.html">Message</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/message-broker.html">Message Broker</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/message-bus.html">Message Bus</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/message-channel.html">Message Channel</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/message-dispatcher.html">Message Dispatcher</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/message-endpoint.html">Message Endpoint</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/message-expiration.html">Message Expiration</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/message-history.html">Message History</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/message-router.html">Message Router</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/message-translator.html">Message Translator</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/messaging-bridge.html">Messaging Bridge</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/messaging-gateway.html">Messaging Gateway</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/messaging-mapper.html">Messaging Mapper</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/multicast-eip.html">Multicast</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/normalizer.html">Normalizer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/onFallback-eip.html">On Fallback</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/pausable-eip.html">Pausable</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/pipeline-eip.html">Pipeline</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/point-to-point-channel.html">Point to Point Channel</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/poll-eip.html">Poll</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/pollEnrich-eip.html">Poll Enrich</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/polling-consumer.html">Polling Consumer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/process-eip.html">Process</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/process-manager.html">Process Manager</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/publish-subscribe-channel.html">Publish Subscribe Channel</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/randomLoadBalancer-eip.html">Random Load Balancer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/recipientList-eip.html">Recipient List</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/removeHeader-eip.html">Remove Header</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/removeHeaders-eip.html">Remove Headers</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/removeProperties-eip.html">Remove Properties</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/removeProperty-eip.html">Remove Property</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/removeVariable-eip.html">Remove Variable</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/requestReply-eip.html">Request Reply</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/resequence-eip.html">Resequence</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/resilience4jConfiguration-eip.html">Resilience4j Configuration</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/resilience4j-eip.html">Resilience4j EIP</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/resumable-eip.html">Resumable</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/resume-strategies.html">Resume Strategies</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/return-address.html">Return Address</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/rollback-eip.html">Rollback</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/roundRobinLoadBalancer-eip.html">Round Robin Load Balancer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/routingSlip-eip.html">Routing Slip</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/saga-eip.html">Saga</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/sample-eip.html">Sample</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/scatter-gather.html">Scatter-Gather</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/script-eip.html">Script</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/selective-consumer.html">Selective Consumer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/service-activator.html">Service Activator</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/setBody-eip.html">Set Body</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/setHeader-eip.html">Set Header</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/setHeaders-eip.html">Set Headers</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/setProperty-eip.html">Set Property</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/setVariable-eip.html">Set Variable</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/setVariables-eip.html">Set Variables</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/sort-eip.html">Sort</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/tokenizer-eip.html">Specialized tokenizer for AI applications</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/split-eip.html">Split</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/step-eip.html">Step</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/stickyLoadBalancer-eip.html">Sticky Load Balancer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/stop-eip.html">Stop</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/throwException-eip.html">Stop</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/streamConfig-eip.html">StreamConfig</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/threads-eip.html">Threads</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/throttle-eip.html">Throttle</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/to-eip.html">To</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/toD-eip.html">To D</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/topicLoadBalancer-eip.html">Topic Load Balancer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/transactional-client.html">Transactional Client</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/transform-eip.html">Transform</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/transformDataType-eip.html">Transform Data Type</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/unmarshal-eip.html">Unmarshal</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/validate-eip.html">Validate</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/weightedLoadBalancer-eip.html">Weighted Load Balancer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="eips/wireTap-eip.html">Wire Tap</a> </li> </ul> </li> </ul> </li> </ul> </nav> </div> <div class="nav-panel-explore" data-panel="explore"> <div class="context"> <span class="title">Camel Components</span> <span class="version">Next (Pre-release)</span> </div> <ul class="components"> <li class="component"> <span class="title"> <a href="../../manual/index.html">User manual</a> </span></li> <li class="component"> <span class="title"> <a href="../../camel-core/index.html">Camel Core</a> </span></li> <li class="component is-current"><span class="title">Camel Components</span> <ul class="versions"> <li class="version is-current"> <a href="index.html">Next (Pre-release)</a> </li> <li class="version"> <a href="../4.18.x/index.html">4.18.x (LTS)</a> </li> <li class="version"> <a href="../4.14.x/index.html">4.14.x (LTS)</a> </li> </ul></li> <li class="component"><span class="title">Camel Spring Boot</span> <ul class="versions"> <li class="version"> <a href="../../camel-spring-boot/next/index.html">Next (Pre-release)</a> </li> <li class="version"> <a href="../../camel-spring-boot/4.18.x/index.html">4.18.x (LTS)</a> </li> <li class="version"> <a href="../../camel-spring-boot/4.14.x/index.html">4.14.x (LTS)</a> </li> </ul></li> <li class="component"><span class="title">Camel Quarkus</span> <ul class="versions"> <li class="version"> <a href="../../camel-quarkus/next/index.html">Next (Pre-release)</a> </li> <li class="version"> <a href="../../camel-quarkus/3.33.x/index.html">3.33.x</a> </li> <li class="version"> <a href="../../camel-quarkus/3.27.x/index.html">3.27.x</a> </li> </ul></li> <li class="component"><span class="title">Kamelet Catalog</span> <ul class="versions"> <li class="version"> <a href="../../camel-kamelets/next/index.html">Next (Pre-release)</a> </li> <li class="version"> <a href="../../camel-kamelets/4.18.x/index.html">4.18.x (LTS)</a> </li> <li class="version"> <a href="../../camel-kamelets/4.14.x/index.html">4.14.x (LTS)</a> </li> </ul></li> <li class="component"><span class="title">Camel K</span> <ul class="versions"> <li class="version"> <a href="../../camel-k/next/index.html">Next (Pre-release)</a> </li> <li class="version"> <a href="../../camel-k/2.10.x/index.html">2.10.x</a> </li> <li class="version"> <a href="../../camel-k/2.9.x/index.html">2.9.x (LTS)</a> </li> </ul></li> <li class="component"><span class="title">Camel Kafka Connector</span> <ul class="versions"> <li class="version"> <a href="../../camel-kafka-connector/next/index.html">Next (Pre-release)</a> </li> </ul></li> <li class="component"><span class="title">Camel Karaf</span> <ul class="versions"> <li class="version"> <a href="../../camel-karaf/4.9.x/index.html">4.9.x</a> </li> </ul></li> </ul> </div> </div> </aside> </div> <main class="article"> <nav class="toolbar" aria-label="Toolbar"> <button class="nav-toggle" type="button" aria-label="Toggle submenu"></button> <nav class="breadcrumbs" aria-label="breadcrumbs"> <ul> <li><a href="index.html">Camel Components</a></li> <li><a href="index.html">Components</a></li> <li><a href="grpc-component.html">gRPC</a></li> </ul> </nav> <div class="page-versions"> <button class="version-menu-toggle" type="button" title="Show other versions of page">Next (Pre-release)</button> <div class="version-menu"> <a class="version is-current" href="grpc-component.html">Next (Pre-release)</a> <a class="version" href="../4.18.x/grpc-component.html">4.18.x (LTS)</a> <a class="version" href="../4.14.x/grpc-component.html">4.14.x (LTS)</a> </div> </div> <div class="edit-this-page"><a href="https://github.com/apache/camel/edit/main/docs/components/modules/ROOT/pages/grpc-component.adoc">Edit this Page</a></div> </nav> <div class="content"> <article class="doc"> <h1 class="page">gRPC</h1> <div id="preamble"> <div class="sectionbody"> <div class="paragraph"> <p><strong>Since Camel 2.19</strong></p> </div> <div class="paragraph"> <p><strong>Both producer and consumer are supported</strong></p> </div> <div class="paragraph"> <p>The gRPC component allows you to call or expose Remote Procedure Call (RPC) services using <a href="https://developers.google.com/protocol-buffers/docs/overview">Protocol Buffers (protobuf)</a> exchange format over HTTP/2 transport.</p> </div> <div class="paragraph"> <p>Maven users will need to add the following dependency to their <code>pom.xml</code> for this component:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><dependency> |
| <groupId>org.apache.camel</groupId> |
| <artifactId>camel-grpc</artifactId> |
| <version>x.x.x</version> |
| <!-- use the same version as your Camel core version --> |
| </dependency></code></pre> </div> </div> </div> </div> <div class="sect1"> <h2 id="_uri_format"><a class="anchor" href="#_uri_format"></a>URI format</h2> <div class="sectionbody"> <div class="listingblock"> <div class="content"> <pre>grpc:host:port/service[?options]</pre> </div> </div> </div> </div> <div class="sect1"> <h2 id="_configuring_options"><a class="anchor" href="#_configuring_options"></a>Configuring Options</h2> <div class="sectionbody"> <div class="paragraph"> <p>Camel components are configured on two separate levels:</p> </div> <div class="ulist"> <ul> <li> <p>component level</p> </li> <li> <p>endpoint level</p> </li> </ul> </div> <div class="sect2"> <h3 id="_configuring_component_options"><a class="anchor" href="#_configuring_component_options"></a>Configuring Component Options</h3> <div class="paragraph"> <p>At the component level, you set general and shared configurations that are, then, inherited by the endpoints. It is the highest configuration level.</p> </div> <div class="paragraph"> <p>For example, a component may have security settings, credentials for authentication, urls for network connection and so forth.</p> </div> <div class="paragraph"> <p>Some components only have a few options, and others may have many. Because components typically have pre-configured defaults that are commonly used, then you may often only need to configure a few options on a component; or none at all.</p> </div> <div class="paragraph"> <p>You can configure components using:</p> </div> <div class="ulist"> <ul> <li> <p>the <a href="../../manual/component-dsl.html" class="xref page">Component DSL</a>.</p> </li> <li> <p>in a configuration file (<code>application.properties</code>, <code>*.yaml</code> files, etc).</p> </li> <li> <p>directly in the Java code.</p> </li> </ul> </div> </div> <div class="sect2"> <h3 id="_configuring_endpoint_options"><a class="anchor" href="#_configuring_endpoint_options"></a>Configuring Endpoint Options</h3> <div class="paragraph"> <p>You usually spend more time setting up endpoints because they have many options. These options help you customize what you want the endpoint to do. The options are also categorized into whether the endpoint is used as a consumer (<em>from</em>), as a producer (<em>to</em>), or both.</p> </div> <div class="paragraph"> <p>Configuring endpoints is most often done directly in the endpoint URI as <em>path</em> and <em>query</em> parameters. You can also use the <a href="../../manual/Endpoint-dsl.html" class="xref page">Endpoint DSL</a> and <a href="../../manual/dataformat-dsl.html" class="xref page">DataFormat DSL</a> as a <em>type safe</em> way of configuring endpoints and data formats in Java.</p> </div> <div class="paragraph"> <p>A good practice when configuring options is to use <a href="../../manual/using-propertyplaceholder.html" class="xref page">Property Placeholders</a>.</p> </div> <div class="paragraph"> <p>Property placeholders provide a few benefits:</p> </div> <div class="ulist"> <ul> <li> <p>They help prevent using hardcoded urls, port numbers, sensitive information, and other settings.</p> </li> <li> <p>They allow externalizing the configuration from the code.</p> </li> <li> <p>They help the code to become more flexible and reusable.</p> </li> </ul> </div> <div class="paragraph"> <p>The following two sections list all the options, firstly for the component followed by the endpoint.</p> </div> </div> </div> </div> <div class="sect1"> <h2 id="_component_options"><a class="anchor" href="#_component_options"></a>Component Options</h2> <div class="sectionbody"> <div class="paragraph"> <p>The gRPC component supports the following options which are listed below.</p> </div> <div class="table-wrapper"><table class="tableblock frame-all grid-all stretch"> <colgroup> <col> <col> <col> <col> </colgroup> <thead> <tr> <th class="tableblock halign-left valign-top">Name</th> <th class="tableblock halign-left valign-top">Description</th> <th class="tableblock halign-center valign-top">Default</th> <th class="tableblock halign-left valign-top">Type</th> </tr> </thead> <tbody> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_component_option_bridgeErrorHandler"></a> <a href="#_component_option_bridgeErrorHandler" class="anchor"></a><strong>bridgeErrorHandler</strong> (consumer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions (if possible) occurred while the Camel consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. Important: This is only possible if the 3rd party component allows Camel to be alerted if an exception was thrown. Some components handle this internally only, and therefore bridgeErrorHandler is not possible. In other situations we may improve the Camel component to hook into the 3rd party component and make this possible for future releases. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">false</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_component_option_lazyStartProducer"></a> <a href="#_component_option_lazyStartProducer" class="anchor"></a><strong>lazyStartProducer</strong> (producer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel’s routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">false</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_component_option_autowiredEnabled"></a> <a href="#_component_option_autowiredEnabled" class="anchor"></a><strong>autowiredEnabled</strong> (advanced)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which then gets configured on the component. This can be used for automatic configuring JDBC data sources, JMS connection factories, AWS Clients, etc.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">true</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td> </tr> </tbody> </table></div> </div> </div> <div class="sect1"> <h2 id="_endpoint_options"><a class="anchor" href="#_endpoint_options"></a>Endpoint Options</h2> <div class="sectionbody"> <div class="paragraph"> <p>The gRPC endpoint is configured using URI syntax:</p> </div> <div class="listingblock"> <div class="content"> <pre>grpc:host:port/service</pre> </div> </div> <div class="paragraph"> <p>With the following <em>path</em> and <em>query</em> parameters:</p> </div> <div class="sect2"> <h3 id="_path_parameters"><a class="anchor" href="#_path_parameters"></a>Path Parameters</h3> <div class="table-wrapper"><table class="tableblock frame-all grid-all stretch"> <colgroup> <col> <col> <col> <col> </colgroup> <thead> <tr> <th class="tableblock halign-left valign-top">Name</th> <th class="tableblock halign-left valign-top">Description</th> <th class="tableblock halign-center valign-top">Default</th> <th class="tableblock halign-left valign-top">Type</th> </tr> </thead> <tbody> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_path_option_host"></a> <a href="#_endpoint_path_option_host" class="anchor"></a><strong>host</strong> (common)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p><strong>Required</strong> The gRPC server host name. This is localhost or 0.0.0.0 when being a consumer or remote server host name when using producer.</p> </div></div></td> <td class="tableblock halign-center valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_path_option_port"></a> <a href="#_endpoint_path_option_port" class="anchor"></a><strong>port</strong> (common)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p><strong>Required</strong> The gRPC local or remote server port.</p> </div></div></td> <td class="tableblock halign-center valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_path_option_service"></a> <a href="#_endpoint_path_option_service" class="anchor"></a><strong>service</strong> (common)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p><strong>Required</strong> Fully qualified service name from the protocol buffer descriptor file (package dot service definition name).</p> </div></div></td> <td class="tableblock halign-center valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td> </tr> </tbody> </table></div> </div> <div class="sect2"> <h3 id="_query_parameters"><a class="anchor" href="#_query_parameters"></a>Query Parameters</h3> <div class="table-wrapper"><table class="tableblock frame-all grid-all stretch"> <colgroup> <col> <col> <col> <col> </colgroup> <thead> <tr> <th class="tableblock halign-left valign-top">Name</th> <th class="tableblock halign-left valign-top">Description</th> <th class="tableblock halign-center valign-top">Default</th> <th class="tableblock halign-left valign-top">Type</th> </tr> </thead> <tbody> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_flowControlWindow"></a> <a href="#_endpoint_query_option_flowControlWindow" class="anchor"></a><strong>flowControlWindow</strong> (common)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>The HTTP/2 flow control window size (MiB).</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">1048576</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_maxMessageSize"></a> <a href="#_endpoint_query_option_maxMessageSize" class="anchor"></a><strong>maxMessageSize</strong> (common)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>The maximum message size allowed to be received/sent (MiB).</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">4194304</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_autoDiscoverServerInterceptors"></a> <a href="#_endpoint_query_option_autoDiscoverServerInterceptors" class="anchor"></a><strong>autoDiscoverServerInterceptors</strong> (consumer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Setting the autoDiscoverServerInterceptors mechanism, if true, the component will look for a ServerInterceptor instance in the registry automatically otherwise it will skip that checking.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">true</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_consumerStrategy"></a> <a href="#_endpoint_query_option_consumerStrategy" class="anchor"></a><strong>consumerStrategy</strong> (consumer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>This option specifies the top-level strategy for processing service requests and responses in streaming mode. If an aggregation strategy is selected, all requests will be accumulated in the list, then transferred to the flow, and the accumulated responses will be sent to the sender. If a propagation strategy is selected, request is sent to the stream, and the response will be immediately sent back to the sender. If a delegation strategy is selected, request is sent to the stream, but no response generated under the assumption that all necessary responses will be sent at another part of route. Delegation strategy always comes with routeControlledStreamObserver=true to be able to achieve the assumption.</p> </div> <div class="paragraph"> <p>Enum values:</p> </div> <div class="ulist"> <ul> <li> <p>AGGREGATION</p> </li> <li> <p>PROPAGATION</p> </li> <li> <p>DELEGATION</p> </li> </ul> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">PROPAGATION</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">GrpcConsumerStrategy</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_forwardOnCompleted"></a> <a href="#_endpoint_query_option_forwardOnCompleted" class="anchor"></a><strong>forwardOnCompleted</strong> (consumer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Determines if onCompleted events should be pushed to the Camel route.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">false</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_forwardOnError"></a> <a href="#_endpoint_query_option_forwardOnError" class="anchor"></a><strong>forwardOnError</strong> (consumer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Determines if onError events should be pushed to the Camel route. Exceptions will be set as message body.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">false</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_initialFlowControlWindow"></a> <a href="#_endpoint_query_option_initialFlowControlWindow" class="anchor"></a><strong>initialFlowControlWindow</strong> (consumer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Sets the initial flow control window in bytes.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">1048576</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_keepAliveTime"></a> <a href="#_endpoint_query_option_keepAliveTime" class="anchor"></a><strong>keepAliveTime</strong> (consumer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Sets a custom keepalive time in milliseconds, the delay time for sending next keepalive ping. A value of Long.MAX_VALUE or a value greater or equal to NettyServerBuilder.AS_LARGE_AS_INFINITE will disable keepalive.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">7200000</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_keepAliveTimeout"></a> <a href="#_endpoint_query_option_keepAliveTimeout" class="anchor"></a><strong>keepAliveTimeout</strong> (consumer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Sets a custom keepalive timeout in milliseconds, the timeout for keepalive ping requests.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">20000</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_maxConcurrentCallsPerConnection"></a> <a href="#_endpoint_query_option_maxConcurrentCallsPerConnection" class="anchor"></a><strong>maxConcurrentCallsPerConnection</strong> (consumer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>The maximum number of concurrent calls permitted for each incoming server connection. Defaults to no limit.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">2147483647</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_maxConnectionAge"></a> <a href="#_endpoint_query_option_maxConnectionAge" class="anchor"></a><strong>maxConnectionAge</strong> (consumer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Sets a custom max connection age in milliseconds. Connections lasting longer than which will be gracefully terminated. A random jitter of /-10% will be added to the value. A value of Long.MAX_VALUE (the default) or a value greater or equal to NettyServerBuilder.AS_LARGE_AS_INFINITE will disable max connection age.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">9223372036854776000</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_maxConnectionAgeGrace"></a> <a href="#_endpoint_query_option_maxConnectionAgeGrace" class="anchor"></a><strong>maxConnectionAgeGrace</strong> (consumer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Sets a custom grace time in milliseconds for the graceful connection termination. A value of Long.MAX_VALUE (the default) or a value greater or equal to NettyServerBuilder.AS_LARGE_AS_INFINITE is considered infinite.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">9223372036854776000</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_maxConnectionIdle"></a> <a href="#_endpoint_query_option_maxConnectionIdle" class="anchor"></a><strong>maxConnectionIdle</strong> (consumer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Sets a custom max connection idle time in milliseconds. Connection being idle for longer than which will be gracefully terminated. A value of Long.MAX_VALUE (the default) or a value greater or equal to NettyServerBuilder.AS_LARGE_AS_INFINITE will disable max connection idle.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">9223372036854776000</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_maxInboundMetadataSize"></a> <a href="#_endpoint_query_option_maxInboundMetadataSize" class="anchor"></a><strong>maxInboundMetadataSize</strong> (consumer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Sets the maximum size of metadata allowed to be received. The default is 8 KiB.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">8192</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_maxRstFramesPerWindow"></a> <a href="#_endpoint_query_option_maxRstFramesPerWindow" class="anchor"></a><strong>maxRstFramesPerWindow</strong> (consumer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Limits the rate of incoming RST_STREAM frames per connection to maxRstFramesPerWindow per maxRstPeriodSeconds. This option MUST be used in conjunction with maxRstPeriodSeconds for it to be effective.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_maxRstPeriodSeconds"></a> <a href="#_endpoint_query_option_maxRstPeriodSeconds" class="anchor"></a><strong>maxRstPeriodSeconds</strong> (consumer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Limits the rate of incoming RST_STREAM frames per maxRstPeriodSeconds. This option MUST be used in conjunction with maxRstFramesPerWindow for it to be effective.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_permitKeepAliveTime"></a> <a href="#_endpoint_query_option_permitKeepAliveTime" class="anchor"></a><strong>permitKeepAliveTime</strong> (consumer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Sets the most aggressive keep-alive time in milliseconds that clients are permitted to configure. The server will try to detect clients exceeding this rate and will forcefully close the connection.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">300000</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_permitKeepAliveWithoutCalls"></a> <a href="#_endpoint_query_option_permitKeepAliveWithoutCalls" class="anchor"></a><strong>permitKeepAliveWithoutCalls</strong> (consumer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Sets whether to allow clients to send keep-alive HTTP/ 2 PINGs even if there are no outstanding RPCs on the connection.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">false</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_routeControlledStreamObserver"></a> <a href="#_endpoint_query_option_routeControlledStreamObserver" class="anchor"></a><strong>routeControlledStreamObserver</strong> (consumer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Lets the route to take control over stream observer. If this value is set to true, then the response observer of gRPC call will be set with the name GrpcConstants.GRPC_RESPONSE_OBSERVER in the Exchange object. Please note that the stream observer’s onNext(), onError(), onCompleted() methods should be called in the route.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">false</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_bridgeErrorHandler"></a> <a href="#_endpoint_query_option_bridgeErrorHandler" class="anchor"></a><strong>bridgeErrorHandler</strong> (consumer (advanced))</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions (if possible) occurred while the Camel consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. Important: This is only possible if the 3rd party component allows Camel to be alerted if an exception was thrown. Some components handle this internally only, and therefore bridgeErrorHandler is not possible. In other situations we may improve the Camel component to hook into the 3rd party component and make this possible for future releases. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">false</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_exceptionHandler"></a> <a href="#_endpoint_query_option_exceptionHandler" class="anchor"></a><strong>exceptionHandler</strong> (consumer (advanced))</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored.</p> </div></div></td> <td class="tableblock halign-center valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">ExceptionHandler</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_exchangePattern"></a> <a href="#_endpoint_query_option_exchangePattern" class="anchor"></a><strong>exchangePattern</strong> (consumer (advanced))</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Sets the exchange pattern when the consumer creates an exchange.</p> </div> <div class="paragraph"> <p>Enum values:</p> </div> <div class="ulist"> <ul> <li> <p>InOnly</p> </li> <li> <p>InOut</p> </li> </ul> </div></div></td> <td class="tableblock halign-center valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">ExchangePattern</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_autoDiscoverClientInterceptors"></a> <a href="#_endpoint_query_option_autoDiscoverClientInterceptors" class="anchor"></a><strong>autoDiscoverClientInterceptors</strong> (producer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Setting the autoDiscoverClientInterceptors mechanism, if true, the component will look for a ClientInterceptor instance in the registry automatically otherwise it will skip that checking.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">true</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_inheritExchangePropertiesForReplies"></a> <a href="#_endpoint_query_option_inheritExchangePropertiesForReplies" class="anchor"></a><strong>inheritExchangePropertiesForReplies</strong> (producer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Copies exchange properties from original exchange to all exchanges created for route defined by streamRepliesTo.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">false</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_method"></a> <a href="#_endpoint_query_option_method" class="anchor"></a><strong>method</strong> (producer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>gRPC method name.</p> </div></div></td> <td class="tableblock halign-center valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_producerStrategy"></a> <a href="#_endpoint_query_option_producerStrategy" class="anchor"></a><strong>producerStrategy</strong> (producer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>The mode used to communicate with a remote gRPC server. In SIMPLE mode a single exchange is translated into a remote procedure call. In STREAMING mode all exchanges will be sent within the same request (input and output of the recipient gRPC service must be of type 'stream').</p> </div> <div class="paragraph"> <p>Enum values:</p> </div> <div class="ulist"> <ul> <li> <p>SIMPLE</p> </li> <li> <p>STREAMING</p> </li> </ul> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">SIMPLE</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">GrpcProducerStrategy</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_streamRepliesTo"></a> <a href="#_endpoint_query_option_streamRepliesTo" class="anchor"></a><strong>streamRepliesTo</strong> (producer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>When using STREAMING client mode, it indicates the endpoint where responses should be forwarded.</p> </div></div></td> <td class="tableblock halign-center valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_toRouteControlledStreamObserver"></a> <a href="#_endpoint_query_option_toRouteControlledStreamObserver" class="anchor"></a><strong>toRouteControlledStreamObserver</strong> (producer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Expects that exchange property GrpcConstants.GRPC_RESPONSE_OBSERVER is set. Takes its value and calls onNext, onError and onComplete on that StreamObserver. All other gRPC parameters are ignored.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">false</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_userAgent"></a> <a href="#_endpoint_query_option_userAgent" class="anchor"></a><strong>userAgent</strong> (producer)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>The user agent header passed to the server.</p> </div></div></td> <td class="tableblock halign-center valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_lazyStartProducer"></a> <a href="#_endpoint_query_option_lazyStartProducer" class="anchor"></a><strong>lazyStartProducer</strong> (producer (advanced))</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel’s routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">false</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_synchronous"></a> <a href="#_endpoint_query_option_synchronous" class="anchor"></a><strong>synchronous</strong> (advanced)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Sets whether synchronous processing should be strictly used.</p> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">false</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_authenticationType"></a> <a href="#_endpoint_query_option_authenticationType" class="anchor"></a><strong>authenticationType</strong> (security)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Authentication method type in advance to the SSL/TLS negotiation.</p> </div> <div class="paragraph"> <p>Enum values:</p> </div> <div class="ulist"> <ul> <li> <p>NONE</p> </li> <li> <p>GOOGLE</p> </li> <li> <p>JWT</p> </li> </ul> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">NONE</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">GrpcAuthType</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_jwtAlgorithm"></a> <a href="#_endpoint_query_option_jwtAlgorithm" class="anchor"></a><strong>jwtAlgorithm</strong> (security)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>JSON Web Token sign algorithm.</p> </div> <div class="paragraph"> <p>Enum values:</p> </div> <div class="ulist"> <ul> <li> <p>HMAC256</p> </li> <li> <p>HMAC384</p> </li> <li> <p>HMAC512</p> </li> <li> <p>RSA256</p> </li> <li> <p>RSA384</p> </li> <li> <p>RSA512</p> </li> </ul> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">HMAC256</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">JwtAlgorithm</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_jwtIssuer"></a> <a href="#_endpoint_query_option_jwtIssuer" class="anchor"></a><strong>jwtIssuer</strong> (security)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>JSON Web Token issuer.</p> </div></div></td> <td class="tableblock halign-center valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_jwtSecret"></a> <a href="#_endpoint_query_option_jwtSecret" class="anchor"></a><strong>jwtSecret</strong> (security)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>JSON Web Token secret.</p> </div></div></td> <td class="tableblock halign-center valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_jwtSubject"></a> <a href="#_endpoint_query_option_jwtSubject" class="anchor"></a><strong>jwtSubject</strong> (security)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>JSON Web Token subject.</p> </div></div></td> <td class="tableblock halign-center valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_keyCertChainResource"></a> <a href="#_endpoint_query_option_keyCertChainResource" class="anchor"></a><strong>keyCertChainResource</strong> (security)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>The X.509 certificate chain file resource in PEM format link.</p> </div></div></td> <td class="tableblock halign-center valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_keyPassword"></a> <a href="#_endpoint_query_option_keyPassword" class="anchor"></a><strong>keyPassword</strong> (security)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>The PKCS#8 private key file password.</p> </div></div></td> <td class="tableblock halign-center valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_keyResource"></a> <a href="#_endpoint_query_option_keyResource" class="anchor"></a><strong>keyResource</strong> (security)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>The PKCS#8 private key file resource in PEM format link.</p> </div></div></td> <td class="tableblock halign-center valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_negotiationType"></a> <a href="#_endpoint_query_option_negotiationType" class="anchor"></a><strong>negotiationType</strong> (security)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Identifies the security negotiation type used for HTTP/2 communication.</p> </div> <div class="paragraph"> <p>Enum values:</p> </div> <div class="ulist"> <ul> <li> <p>PLAINTEXT</p> </li> <li> <p>TLS</p> </li> </ul> </div></div></td> <td class="tableblock halign-center valign-top"><p class="tableblock">PLAINTEXT</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">NegotiationType</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_serviceAccountResource"></a> <a href="#_endpoint_query_option_serviceAccountResource" class="anchor"></a><strong>serviceAccountResource</strong> (security)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Service Account key file in JSON format resource link supported by the Google Cloud SDK.</p> </div></div></td> <td class="tableblock halign-center valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_query_option_trustCertCollectionResource"></a> <a href="#_endpoint_query_option_trustCertCollectionResource" class="anchor"></a><strong>trustCertCollectionResource</strong> (security)</p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>The trusted certificates collection file resource in PEM format for verifying the remote endpoint’s certificate.</p> </div></div></td> <td class="tableblock halign-center valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td> </tr> </tbody> </table></div> </div> </div> </div> <div class="sect1"> <h2 id="_message_headers"><a class="anchor" href="#_message_headers"></a>Message Headers</h2> <div class="sectionbody"> <div class="paragraph"> <p>The gRPC component supports the following message header(s), which is/are listed below:</p> </div> <div class="table-wrapper"><table class="tableblock frame-all grid-all stretch"> <colgroup> <col> <col> <col> <col> </colgroup> <thead> <tr> <th class="tableblock halign-left valign-top">Name</th> <th class="tableblock halign-left valign-top">Description</th> <th class="tableblock halign-center valign-top">Default</th> <th class="tableblock halign-left valign-top">Type</th> </tr> </thead> <tbody> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_header_CamelGrpcMethodName"></a> <a href="#_endpoint_header_CamelGrpcMethodName" class="anchor"></a><strong>CamelGrpcMethodName</strong> (consumer)</p> <p class="tableblock">Constant: <a href="https://javadoc.io/doc/org.apache.camel/camel-grpc/latest/org/apache/camel/component/grpc/GrpcConstants.html#GRPC_METHOD_NAME_HEADER"><code>GRPC_METHOD_NAME_HEADER</code></a></p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Method name handled by the consumer service.</p> </div></div></td> <td class="tableblock halign-center valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_header_CamelGrpcUserAgent"></a> <a href="#_endpoint_header_CamelGrpcUserAgent" class="anchor"></a><strong>CamelGrpcUserAgent</strong> (consumer)</p> <p class="tableblock">Constant: <a href="https://javadoc.io/doc/org.apache.camel/camel-grpc/latest/org/apache/camel/component/grpc/GrpcConstants.html#GRPC_USER_AGENT_HEADER"><code>GRPC_USER_AGENT_HEADER</code></a></p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>If provided, the given agent will prepend the gRPC library’s user agent information.</p> </div></div></td> <td class="tableblock halign-center valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="_endpoint_header_CamelGrpcEventType"></a> <a href="#_endpoint_header_CamelGrpcEventType" class="anchor"></a><strong>CamelGrpcEventType</strong> (consumer)</p> <p class="tableblock">Constant: <a href="https://javadoc.io/doc/org.apache.camel/camel-grpc/latest/org/apache/camel/component/grpc/GrpcConstants.html#GRPC_EVENT_TYPE_HEADER"><code>GRPC_EVENT_TYPE_HEADER</code></a></p></td> <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> <p>Received event type from the sent request. Possible values: onNext onCompleted onError.</p> </div></div></td> <td class="tableblock halign-center valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td> </tr> </tbody> </table></div> </div> </div> <div class="sect1"> <h2 id="_usage"><a class="anchor" href="#_usage"></a>Usage</h2> <div class="sectionbody"> <div class="sect2"> <h3 id="_transport_security_and_authentication_support"><a class="anchor" href="#_transport_security_and_authentication_support"></a>Transport security and authentication support</h3> <div class="paragraph"> <p>The following <a href="https://grpc.io/docs/guides/auth.html">authentication</a> mechanisms are built-in to gRPC and available in this component:</p> </div> <div class="ulist"> <ul> <li> <p><strong>SSL/TLS:</strong> gRPC has SSL/TLS integration and promotes the use of SSL/TLS to authenticate the server, and to encrypt all the data exchanged between the client and the server. Optional mechanisms are available for clients to provide certificates for mutual authentication.</p> </li> <li> <p><strong>Token-based authentication with Google:</strong> gRPC provides a generic mechanism to attach metadata-based credentials to requests and responses. Additional support for acquiring access tokens while accessing Google APIs through gRPC is provided. In general, this mechanism must be used as well as SSL/TLS on the channel.</p> </li> </ul> </div> <div class="paragraph"> <p>To enable these features, the following component properties combinations must be configured:</p> </div> <div class="table-wrapper"><table class="tableblock frame-all grid-all stretch"> <colgroup> <col> <col> <col> <col> <col> </colgroup> <thead> <tr> <th class="tableblock halign-left valign-top">Num.</th> <th class="tableblock halign-left valign-top">Option</th> <th class="tableblock halign-left valign-top">Parameter</th> <th class="tableblock halign-left valign-top">Value</th> <th class="tableblock halign-left valign-top">Required/Optional</th> </tr> </thead> <tbody> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock">1</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>SSL/TLS</strong></p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">negotiationType</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">TLS</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Required</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">keyCertChainResource</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Required</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">keyResource</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Required</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">keyPassword</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Optional</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">trustCertCollectionResource</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Optional</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock">2</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Token-based authentication with Google API</strong></p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">authenticationType</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">GOOGLE</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Required</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">negotiationType</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">TLS</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Required</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">serviceAccountResource</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Required</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock">3</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Custom JSON Web Token implementation authentication</strong></p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">authenticationType</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">JWT</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Required</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">negotiationType</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">NONE or TLS</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Optional. The TLS/SSL not checking for this type, but strongly recommended.</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">jwtAlgorithm</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">HMAC256(default) or (HMAC384,HMAC512)</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Optional</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">jwtSecret</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Required</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">jwtIssuer</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Optional</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">jwtSubject</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Optional</p></td> </tr> </tbody> </table></div> </div> <div class="sect2"> <h3 id="_grpc_producer_resource_type_mapping"><a class="anchor" href="#_grpc_producer_resource_type_mapping"></a>gRPC producer resource type mapping</h3> <div class="paragraph"> <p>The table below shows the types of objects in the message body, depending on the types (simple or stream) of incoming and outgoing parameters, as well as the invocation style (synchronous or asynchronous). Please note that invocation of the procedures with incoming stream parameter in asynchronous style is not allowed.</p> </div> <div class="table-wrapper"><table class="tableblock frame-all grid-all stretch"> <colgroup> <col> <col> <col> <col> <col> </colgroup> <thead> <tr> <th class="tableblock halign-left valign-top">Invocation style</th> <th class="tableblock halign-left valign-top">Request type</th> <th class="tableblock halign-left valign-top">Response type</th> <th class="tableblock halign-left valign-top">Request Body Type</th> <th class="tableblock halign-left valign-top">Result Body Type</th> </tr> </thead> <tbody> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>synchronous</strong></p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">simple</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">simple</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Object</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Object</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>synchronous</strong></p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">simple</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">stream</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Object</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">List<Object></p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock">synchronous</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">stream</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">simple</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">not allowed</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">not allowed</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock">synchronous</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">stream</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">stream</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">not allowed</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">not allowed</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>asynchronous</strong></p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">simple</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">simple</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Object</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">List<Object></p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>asynchronous</strong></p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">simple</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">stream</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Object</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">List<Object></p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>asynchronous</strong></p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">stream</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">simple</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Object or List<Object></p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">List<Object></p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>asynchronous</strong></p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">stream</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">stream</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Object or List<Object></p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">List<Object></p></td> </tr> </tbody> </table></div> </div> <div class="sect2"> <h3 id="_grpc_proxy"><a class="anchor" href="#_grpc_proxy"></a>gRPC Proxy</h3> <div class="paragraph"> <p>It is not possible to create a universal proxy-route for all methods, so you need to divide your gRPC service into several services by method’s type: unary, server streaming, client streaming and bidirectional streaming.</p> </div> <div class="sect3"> <h4 id="_unary"><a class="anchor" href="#_unary"></a>Unary</h4> <div class="paragraph"> <p>For unary requests, it is enough to write the following code:</p> </div> <div id="_tabs_1" class="openblock tabs is-sync is-loading"> <div class="content"> <div class="ulist tablist"> <ul> <li id="_tabs_1_java" class="tab"> <p>Java</p> </li> <li id="_tabs_1_xml" class="tab"> <p>XML</p> </li> <li id="_tabs_1_yaml" class="tab"> <p>YAML</p> </li> </ul> </div> <div id="_tabs_1_java--panel" class="tabpanel" aria-labelledby="_tabs_1_java"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">from("grpc://localhost:1101/org.apache.camel.component.grpc.PingPong") |
| .toD("grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong?method=${header.CamelGrpcMethodName}");</code></pre> </div> </div> </div> <div id="_tabs_1_xml--panel" class="tabpanel" aria-labelledby="_tabs_1_xml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><route> |
| <from uri="grpc://localhost:1101/org.apache.camel.component.grpc.PingPong"/> |
| <toD uri="grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong?method=${header.CamelGrpcMethodName}"/> |
| </route></code></pre> </div> </div> </div> <div id="_tabs_1_yaml--panel" class="tabpanel" aria-labelledby="_tabs_1_yaml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">- route: |
| from: |
| uri: grpc://localhost:1101/org.apache.camel.component.grpc.PingPong |
| steps: |
| - toD: |
| uri: grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong |
| parameters: |
| method: "${header.CamelGrpcMethodName}"</code></pre> </div> </div> </div> </div> </div> </div> </div> <div class="sect2"> <h3 id="_server_streaming"><a class="anchor" href="#_server_streaming"></a>Server streaming</h3> <div class="paragraph"> <p>Server streaming may be done by the same approach as unary, but in that configuration Camel route will wait stream for completion and will aggregate all responses to a list before sending that data as response stream. If this behavior is unacceptable, you need to apply a number of options:</p> </div> <div class="olist arabic"> <ol class="arabic"> <li> <p>Set <code>routeControlledStreamObserver=true</code> for consumer. Later it will be used to publish responses;</p> </li> <li> <p>Set <code>streamRepliesTo</code> option for producer to handle streaming nature of responses;</p> </li> <li> <p>Set forwarding of <code>onError</code> and <code>onCompleted</code> for producer;</p> </li> <li> <p>Set <code>inheritExchangePropertiesForReplies=true</code> to inherit <code>StreamObserver</code> obtained on the first step;</p> </li> <li> <p>Create another route to process streamed data. That route must contain gRPC-producer step with the only parameter <code>toRouteControlledStreamObserver=true</code> which will publish incoming exchanges as response stream elements.</p> </li> </ol> </div> <div class="paragraph"> <p>Example:</p> </div> <div id="_tabs_2" class="openblock tabs is-sync is-loading"> <div class="content"> <div class="ulist tablist"> <ul> <li id="_tabs_2_java" class="tab"> <p>Java</p> </li> <li id="_tabs_2_xml" class="tab"> <p>XML</p> </li> <li id="_tabs_2_yaml" class="tab"> <p>YAML</p> </li> </ul> </div> <div id="_tabs_2_java--panel" class="tabpanel" aria-labelledby="_tabs_2_java"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">from("grpc://localhost:1101/org.apache.camel.component.grpc.PingPong?routeControlledStreamObserver=true") |
| .toD("grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong?method=${header.CamelGrpcMethodName}&streamRepliesTo=direct:next&forwardOnError=true&forwardOnCompleted=true&inheritExchangePropertiesForReplies=true"); |
| |
| from("direct:next") |
| .to("grpc://dummy:0/?toRouteControlledStreamObserver=true");</code></pre> </div> </div> </div> <div id="_tabs_2_xml--panel" class="tabpanel" aria-labelledby="_tabs_2_xml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><route> |
| <from uri="grpc://localhost:1101/org.apache.camel.component.grpc.PingPong?routeControlledStreamObserver=true"/> |
| <toD uri="grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong?method=${header.CamelGrpcMethodName}&amp;streamRepliesTo=direct:next&amp;forwardOnError=true&amp;forwardOnCompleted=true&amp;inheritExchangePropertiesForReplies=true"/> |
| </route> |
| <route> |
| <from uri="direct:next"/> |
| <to uri="grpc://dummy:0/?toRouteControlledStreamObserver=true"/> |
| </route></code></pre> </div> </div> </div> <div id="_tabs_2_yaml--panel" class="tabpanel" aria-labelledby="_tabs_2_yaml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">- route: |
| from: |
| uri: grpc://localhost:1101/org.apache.camel.component.grpc.PingPong |
| parameters: |
| routeControlledStreamObserver: true |
| steps: |
| - toD: |
| uri: grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong |
| parameters: |
| method: "${header.CamelGrpcMethodName}" |
| streamRepliesTo: direct:next |
| forwardOnError: true |
| forwardOnCompleted: true |
| inheritExchangePropertiesForReplies: true |
| - route: |
| from: |
| uri: direct:next |
| steps: |
| - to: |
| uri: grpc://dummy:0/ |
| parameters: |
| toRouteControlledStreamObserver: true</code></pre> </div> </div> </div> </div> </div> </div> <div class="sect2"> <h3 id="_client_streaming_and_bidirectional_streaming"><a class="anchor" href="#_client_streaming_and_bidirectional_streaming"></a>Client streaming and bidirectional streaming</h3> <div class="paragraph"> <p>Both client streaming and bidirectional streaming gRPC methods expose <code>StreamObserver</code> as responses' handler. Therefore, you need the same technique as described in the server streaming section (all 5 steps).</p> </div> <div class="paragraph"> <p>But there is another thing: requests also come in streaming mode. So you need the following:</p> </div> <div class="olist arabic"> <ol class="arabic"> <li> <p>Set consumer strategy to DELEGATION - that differs from the default PROPAGATION option in the fact that consumer will not produce responses at all. If you set PROPAGATION, then you will receive more responses than you expected;</p> </li> <li> <p>Forward <code>onError</code> and <code>onCompletion</code> on consumer;</p> </li> <li> <p>Set producer strategy to STREAMING.</p> </li> </ol> </div> <div class="paragraph"> <p>Example:</p> </div> <div id="_tabs_3" class="openblock tabs is-sync is-loading"> <div class="content"> <div class="ulist tablist"> <ul> <li id="_tabs_3_java" class="tab"> <p>Java</p> </li> <li id="_tabs_3_xml" class="tab"> <p>XML</p> </li> <li id="_tabs_3_yaml" class="tab"> <p>YAML</p> </li> </ul> </div> <div id="_tabs_3_java--panel" class="tabpanel" aria-labelledby="_tabs_3_java"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">from("grpc://localhost:1101/org.apache.camel.component.grpc.PingPong?routeControlledStreamObserver=true&consumerStrategy=DELEGATION&forwardOnError=true&forwardOnCompleted=true") |
| .toD("grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong?method=${header.CamelGrpcMethodName}&producerStrategy=STREAMING&streamRepliesTo=direct:next&forwardOnError=true&forwardOnCompleted=true&inheritExchangePropertiesForReplies=true"); |
| |
| from("direct:next") |
| .to("grpc://dummy:0/?toRouteControlledStreamObserver=true");</code></pre> </div> </div> </div> <div id="_tabs_3_xml--panel" class="tabpanel" aria-labelledby="_tabs_3_xml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><route> |
| <from uri="grpc://localhost:1101/org.apache.camel.component.grpc.PingPong?routeControlledStreamObserver=true&amp;consumerStrategy=DELEGATION&amp;forwardOnError=true&amp;forwardOnCompleted=true"/> |
| <toD uri="grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong?method=${header.CamelGrpcMethodName}&amp;producerStrategy=STREAMING&amp;streamRepliesTo=direct:next&amp;forwardOnError=true&amp;forwardOnCompleted=true&amp;inheritExchangePropertiesForReplies=true"/> |
| </route> |
| <route> |
| <from uri="direct:next"/> |
| <to uri="grpc://dummy:0/?toRouteControlledStreamObserver=true"/> |
| </route></code></pre> </div> </div> </div> <div id="_tabs_3_yaml--panel" class="tabpanel" aria-labelledby="_tabs_3_yaml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">- route: |
| from: |
| uri: grpc://localhost:1101/org.apache.camel.component.grpc.PingPong |
| parameters: |
| routeControlledStreamObserver: true |
| consumerStrategy: DELEGATION |
| forwardOnError: true |
| forwardOnCompleted: true |
| steps: |
| - toD: |
| uri: grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong |
| parameters: |
| method: "${header.CamelGrpcMethodName}" |
| producerStrategy: STREAMING |
| streamRepliesTo: direct:next |
| forwardOnError: true |
| forwardOnCompleted: true |
| inheritExchangePropertiesForReplies: true |
| - route: |
| from: |
| uri: direct:next |
| steps: |
| - to: |
| uri: grpc://dummy:0/ |
| parameters: |
| toRouteControlledStreamObserver: true</code></pre> </div> </div> </div> </div> </div> </div> </div> </div> <div class="sect1"> <h2 id="_examples"><a class="anchor" href="#_examples"></a>Examples</h2> <div class="sectionbody"> <div class="paragraph"> <p>Below is a simple synchronous method invoke with host and port parameters</p> </div> <div id="_tabs_4" class="openblock tabs is-sync is-loading"> <div class="content"> <div class="ulist tablist"> <ul> <li id="_tabs_4_java" class="tab"> <p>Java</p> </li> <li id="_tabs_4_xml" class="tab"> <p>XML</p> </li> <li id="_tabs_4_yaml" class="tab"> <p>YAML</p> </li> </ul> </div> <div id="_tabs_4_java--panel" class="tabpanel" aria-labelledby="_tabs_4_java"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">from("direct:grpc-sync") |
| .to("grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong?method=sendPing&synchronous=true");</code></pre> </div> </div> </div> <div id="_tabs_4_xml--panel" class="tabpanel" aria-labelledby="_tabs_4_xml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><route> |
| <from uri="direct:grpc-sync"/> |
| <to uri="grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong?method=sendPing&amp;synchronous=true"/> |
| </route></code></pre> </div> </div> </div> <div id="_tabs_4_yaml--panel" class="tabpanel" aria-labelledby="_tabs_4_yaml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">- route: |
| from: |
| uri: direct:grpc-sync |
| steps: |
| - to: |
| uri: grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong |
| parameters: |
| method: sendPing |
| synchronous: true</code></pre> </div> </div> </div> </div> </div> <div class="paragraph"> <p>An asynchronous method invoke</p> </div> <div id="_tabs_5" class="openblock tabs is-sync is-loading"> <div class="content"> <div class="ulist tablist"> <ul> <li id="_tabs_5_java" class="tab"> <p>Java</p> </li> <li id="_tabs_5_xml" class="tab"> <p>XML</p> </li> <li id="_tabs_5_yaml" class="tab"> <p>YAML</p> </li> </ul> </div> <div id="_tabs_5_java--panel" class="tabpanel" aria-labelledby="_tabs_5_java"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">from("direct:grpc-async") |
| .to("grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong?method=pingAsyncResponse");</code></pre> </div> </div> </div> <div id="_tabs_5_xml--panel" class="tabpanel" aria-labelledby="_tabs_5_xml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><route> |
| <from uri="direct:grpc-async"/> |
| <to uri="grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong?method=pingAsyncResponse"/> |
| </route></code></pre> </div> </div> </div> <div id="_tabs_5_yaml--panel" class="tabpanel" aria-labelledby="_tabs_5_yaml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">- route: |
| from: |
| uri: direct:grpc-async |
| steps: |
| - to: |
| uri: grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong |
| parameters: |
| method: pingAsyncResponse</code></pre> </div> </div> </div> </div> </div> <div class="paragraph"> <p>gRPC service consumer with propagation consumer strategy</p> </div> <div id="_tabs_6" class="openblock tabs is-sync is-loading"> <div class="content"> <div class="ulist tablist"> <ul> <li id="_tabs_6_java" class="tab"> <p>Java</p> </li> <li id="_tabs_6_xml" class="tab"> <p>XML</p> </li> <li id="_tabs_6_yaml" class="tab"> <p>YAML</p> </li> </ul> </div> <div id="_tabs_6_java--panel" class="tabpanel" aria-labelledby="_tabs_6_java"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">from("grpc://localhost:1101/org.apache.camel.component.grpc.PingPong?consumerStrategy=PROPAGATION") |
| .to("direct:grpc-service");</code></pre> </div> </div> </div> <div id="_tabs_6_xml--panel" class="tabpanel" aria-labelledby="_tabs_6_xml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><route> |
| <from uri="grpc://localhost:1101/org.apache.camel.component.grpc.PingPong?consumerStrategy=PROPAGATION"/> |
| <to uri="direct:grpc-service"/> |
| </route></code></pre> </div> </div> </div> <div id="_tabs_6_yaml--panel" class="tabpanel" aria-labelledby="_tabs_6_yaml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">- route: |
| from: |
| uri: grpc://localhost:1101/org.apache.camel.component.grpc.PingPong |
| parameters: |
| consumerStrategy: PROPAGATION |
| steps: |
| - to: |
| uri: direct:grpc-service</code></pre> </div> </div> </div> </div> </div> <div class="paragraph"> <p>gRPC service producer with streaming producer strategy (requires a service that uses "stream" mode as input and output)</p> </div> <div id="_tabs_7" class="openblock tabs is-sync is-loading"> <div class="content"> <div class="ulist tablist"> <ul> <li id="_tabs_7_java" class="tab"> <p>Java</p> </li> <li id="_tabs_7_xml" class="tab"> <p>XML</p> </li> <li id="_tabs_7_yaml" class="tab"> <p>YAML</p> </li> </ul> </div> <div id="_tabs_7_java--panel" class="tabpanel" aria-labelledby="_tabs_7_java"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">from("direct:grpc-request-stream") |
| .to("grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong?method=PingAsyncAsync&producerStrategy=STREAMING&streamRepliesTo=direct:grpc-response-stream"); |
| |
| from("direct:grpc-response-stream") |
| .log("Response received: ${body}");</code></pre> </div> </div> </div> <div id="_tabs_7_xml--panel" class="tabpanel" aria-labelledby="_tabs_7_xml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><route> |
| <from uri="direct:grpc-request-stream"/> |
| <to uri="grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong?method=PingAsyncAsync&amp;producerStrategy=STREAMING&amp;streamRepliesTo=direct:grpc-response-stream"/> |
| </route> |
| <route> |
| <from uri="direct:grpc-response-stream"/> |
| <log message="Response received: ${body}"/> |
| </route></code></pre> </div> </div> </div> <div id="_tabs_7_yaml--panel" class="tabpanel" aria-labelledby="_tabs_7_yaml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">- route: |
| from: |
| uri: direct:grpc-request-stream |
| steps: |
| - to: |
| uri: grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong |
| parameters: |
| method: PingAsyncAsync |
| producerStrategy: STREAMING |
| streamRepliesTo: direct:grpc-response-stream |
| - route: |
| from: |
| uri: direct:grpc-response-stream |
| steps: |
| - log: "Response received: ${body}"</code></pre> </div> </div> </div> </div> </div> <div class="paragraph"> <p>gRPC service consumer TLS/SSL security negotiation enabled</p> </div> <div id="_tabs_8" class="openblock tabs is-sync is-loading"> <div class="content"> <div class="ulist tablist"> <ul> <li id="_tabs_8_java" class="tab"> <p>Java</p> </li> <li id="_tabs_8_xml" class="tab"> <p>XML</p> </li> <li id="_tabs_8_yaml" class="tab"> <p>YAML</p> </li> </ul> </div> <div id="_tabs_8_java--panel" class="tabpanel" aria-labelledby="_tabs_8_java"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">from("grpc://localhost:1101/org.apache.camel.component.grpc.PingPong?consumerStrategy=PROPAGATION&negotiationType=TLS&keyCertChainResource=file:src/test/resources/certs/server.pem&keyResource=file:src/test/resources/certs/server.key&trustCertCollectionResource=file:src/test/resources/certs/ca.pem") |
| .to("direct:tls-enable");</code></pre> </div> </div> </div> <div id="_tabs_8_xml--panel" class="tabpanel" aria-labelledby="_tabs_8_xml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><route> |
| <from uri="grpc://localhost:1101/org.apache.camel.component.grpc.PingPong?consumerStrategy=PROPAGATION&amp;negotiationType=TLS&amp;keyCertChainResource=file:src/test/resources/certs/server.pem&amp;keyResource=file:src/test/resources/certs/server.key&amp;trustCertCollectionResource=file:src/test/resources/certs/ca.pem"/> |
| <to uri="direct:tls-enable"/> |
| </route></code></pre> </div> </div> </div> <div id="_tabs_8_yaml--panel" class="tabpanel" aria-labelledby="_tabs_8_yaml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">- route: |
| from: |
| uri: grpc://localhost:1101/org.apache.camel.component.grpc.PingPong |
| parameters: |
| consumerStrategy: PROPAGATION |
| negotiationType: TLS |
| keyCertChainResource: "file:src/test/resources/certs/server.pem" |
| keyResource: "file:src/test/resources/certs/server.key" |
| trustCertCollectionResource: "file:src/test/resources/certs/ca.pem" |
| steps: |
| - to: |
| uri: direct:tls-enable</code></pre> </div> </div> </div> </div> </div> <div class="paragraph"> <p>gRPC service producer with custom JSON Web Token (JWT) implementation authentication</p> </div> <div id="_tabs_9" class="openblock tabs is-sync is-loading"> <div class="content"> <div class="ulist tablist"> <ul> <li id="_tabs_9_java" class="tab"> <p>Java</p> </li> <li id="_tabs_9_xml" class="tab"> <p>XML</p> </li> <li id="_tabs_9_yaml" class="tab"> <p>YAML</p> </li> </ul> </div> <div id="_tabs_9_java--panel" class="tabpanel" aria-labelledby="_tabs_9_java"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">from("direct:grpc-jwt") |
| .to("grpc://localhost:1101/org.apache.camel.component.grpc.PingPong?method=pingSyncSync&synchronous=true&authenticationType=JWT&jwtSecret=supersecuredsecret");</code></pre> </div> </div> </div> <div id="_tabs_9_xml--panel" class="tabpanel" aria-labelledby="_tabs_9_xml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><route> |
| <from uri="direct:grpc-jwt"/> |
| <to uri="grpc://localhost:1101/org.apache.camel.component.grpc.PingPong?method=pingSyncSync&amp;synchronous=true&amp;authenticationType=JWT&amp;jwtSecret=supersecuredsecret"/> |
| </route></code></pre> </div> </div> </div> <div id="_tabs_9_yaml--panel" class="tabpanel" aria-labelledby="_tabs_9_yaml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">- route: |
| from: |
| uri: direct:grpc-jwt |
| steps: |
| - to: |
| uri: grpc://localhost:1101/org.apache.camel.component.grpc.PingPong |
| parameters: |
| method: pingSyncSync |
| synchronous: true |
| authenticationType: JWT |
| jwtSecret: supersecuredsecret</code></pre> </div> </div> </div> </div> </div> </div> </div> <div class="sect1"> <h2 id="_configuration"><a class="anchor" href="#_configuration"></a>Configuration</h2> <div class="sectionbody"> <div class="paragraph"> <p>It is recommended to use the <code>protobuf-maven-plugin</code>, which calls the Protocol Buffer Compiler (protoc) to generate Java source files from .proto (protocol buffer definition) files. This plugin will generate procedure request and response classes, their builders and gRPC procedures stubs classes as well.</p> </div> <div class="paragraph"> <p>The following steps are required:</p> </div> <div class="paragraph"> <p>Insert operating system and CPU architecture detection extension inside <strong><build></strong> tag of the project <code>pom.xml</code> or set <code>${os.detected.classifier}</code> parameter manually</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><extensions> |
| <extension> |
| <groupId>kr.motd.maven</groupId> |
| <artifactId>os-maven-plugin</artifactId> |
| <version>1.7.1</version> |
| </extension> |
| </extensions></code></pre> </div> </div> <div class="paragraph"> <p>Insert the gRPC and protobuf Java code generator plugins into the <strong><plugins></strong> tag of the project pom.xml</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><plugin> |
| <groupId>org.xolstice.maven.plugins</groupId> |
| <artifactId>protobuf-maven-plugin</artifactId> |
| <version>0.6.1</version> |
| <configuration> |
| <protocArtifact>com.google.protobuf:protoc:${protobuf-version}:exe:${os.detected.classifier}</protocArtifact> |
| <pluginId>grpc-java</pluginId> |
| <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc-version}:exe:${os.detected.classifier}</pluginArtifact> |
| </configuration> |
| <executions> |
| <execution> |
| <goals> |
| <goal>compile</goal> |
| <goal>compile-custom</goal> |
| <goal>test-compile</goal> |
| <goal>test-compile-custom</goal> |
| </goals> |
| </execution> |
| </executions> |
| </plugin></code></pre> </div> </div> </div> </div> <div class="sect1"> <h2 id="_more_information"><a class="anchor" href="#_more_information"></a>More information</h2> <div class="sectionbody"> <div class="paragraph"> <p>See these resources:</p> </div> <div class="ulist"> <ul> <li> <p><a href="https://www.grpc.io/">gRPC project site</a></p> </li> <li> <p><a href="https://www.xolstice.org/protobuf-maven-plugin">Maven Protocol Buffers Plugin</a></p> </li> </ul> </div> </div> </div> </article> <aside class="toc sidebar" aria-label="Table of contents" data-title="Contents" data-levels="2"> <div class="toc-menu"></div> </aside> </div> </main> </div> <div class="footer-tools"> <a href="#top" title="Reach the top of the page">Back to top</a> </div> <footer> <div class="footer"> <figure class="logo"> <img src="../../_/img/logo-d-a567cee6fa.svg" class="logo-small mt-60" alt="Apache Camel Logo" aria-label="white silhouette of a camel in front of a sand dune"> </figure> <input id="footer-toggle-overview" type="checkbox" title="Show/Hide Overview section"> <dl> <dt><label for="footer-toggle-overview">Overview</label><label for="footer-toggle-overview">+</label></dt> <dd><a href="../../blog/">Blog</a></dd> <dd><a href="../../docs/">Documentation</a></dd> <dd><a href="../../community/support/">Community</a></dd> <dd><a href="../../download/">Download</a></dd> </dl> <input id="footer-toggle-documentation" type="checkbox" title="Show/Hide Documentation section"> <dl> <dt><label for="footer-toggle-documentation">Documentation</label><label for="footer-toggle-documentation">+</label></dt> <dd><a href="../../manual/">User Manual</a></dd> <dd><a href="../../components/next/index.html">Components</a></dd> <dd><a href="../../camel-k/next/">Camel-K</a></dd> <dd><a href="../../camel-kafka-connector/next/">Camel Kafka Connector</a></dd> <dd><a href="../../camel-quarkus/next/">Camel Quarkus</a></dd> <dd><a href="../../camel-spring-boot/next/">Camel Spring Boot</a></dd> <dd><a href="../../camel-karaf/latest/">Camel Karaf</a></dd> <dd><a href="../../manual/faq/index.html">FAQ</a></dd> </dl> <input id="footer-toggle-community" type="checkbox" title="Show/Hide Community section"> <dl> <dt><label for="footer-toggle-community">Community</label><label for="footer-toggle-community">+</label></dt> <dd><a href="../../community/support/">Support</a></dd> <dd><a href="../../community/contributing/">Contributing</a></dd> <dd><a href="../../community/mailing-list/">Mailing Lists</a></dd> <dd><a href="../../community/user-stories/">User stories</a></dd> <dd><a href="../../community/articles/">Articles</a></dd> <dd><a href="../../community/books/">Books</a></dd> <dd><a href="../../community/team/">Team</a></dd> </dl> <input id="footer-toggle-about" type="checkbox" title="Show/Hide Acknowledgements section"> <dl> <dt><label for="footer-toggle-about">About</label><label for="footer-toggle-about">+</label></dt> <dd><a href="../../acknowledgments/">Acknowledgments</a></dd> <dd><a target="_blank" rel="noopener noreferrer nofollow" href="https://www.apache.org/events/current-event.html" title="Apache Events">Apache Events</a></dd> <dd><a target="_blank" rel="noopener noreferrer nofollow" href="https://www.apache.org/licenses/" title="License">License</a></dd> <dd><a target="_blank" rel="noopener noreferrer nofollow" href="https://www.apache.org/security/" title="Security">Security</a></dd> <dd><a target="_blank" rel="noopener noreferrer nofollow" href="https://www.apache.org/foundation/sponsorship.html" title="Sponsorship">Sponsorship</a></dd> <dd><a target="_blank" rel="noopener noreferrer nofollow" href="https://www.apache.org/foundation/thanks.html" title="Thanks">Thanks</a></dd> </dl> <p class="remark"> © 2004-2026 The <a href="https://apache.org">Apache Software Foundation</a>.<br> Apache Camel, Camel, Apache, the Apache feather logo, and the Apache Camel project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners. </p> <div class="resources"> <div class="context"> <a href="https://privacy.apache.org/policies/privacy-policy-public.html">Privacy Policy</a> </div> <div class="context"> <a target="_blank" rel="noopener noreferrer nofollow" href="https://www.apache.org/foundation/policies/conduct">Code of Conduct</a> </div> <div class="context"> <a href="../../sitemap/">Sitemap</a> </div> </div> <div class="footer-icons"> <a rel="noopener noreferrer nofollow" href="https://github.com/apache/camel/" title="Collaborate on GitHub"><svg class="brand-icon" focusable="false"><use xlink:href="../../_/img/brand-logos-a2b35bbdec.svg#github"/></svg></a> <a rel="noopener noreferrer nofollow" href="https://camel.zulipchat.com" title="Chat on Zulip"><svg class="brand-icon" focusable="false"><use xlink:href="../../_/img/brand-logos-a2b35bbdec.svg#zulip"/></svg></a> <a rel="noopener noreferrer nofollow" href="https://twitter.com/ApacheCamel" title="Follow Apache Camel on Twitter"><svg class="brand-icon" focusable="false"><use xlink:href="../../_/img/brand-logos-a2b35bbdec.svg#twitter"/></svg></a> <a rel="noopener noreferrer nofollow" href="https://www.linkedin.com/groups/2447439/" title="Apache Camel group on Linkedin"><svg class="brand-icon" focusable="false"><use xlink:href="../../_/img/brand-logos-a2b35bbdec.svg#linkedin"/></svg></a> </div> </div> </footer> <script src="../../_/js/vendor/algoliasearch-c7d08807d6.js"></script> <script src="../../_/js/site-0eeb09d476.js"></script> <script async src="../../_/js/vendor/highlight-621a10fe1b.js"></script> <script async src="../../_/js/vendor/svg4everybody-a0c573f2b9.js"></script> <script async src="../../_/js/vendor/tabs-5aea11bcf5.js" data-sync-storage-key="preferred-tab"></script> <script type="application/ld+json"> { "@context": "http://schema.org", "@type": "Organization", "name": "Apache Camel", "url": "https://camel.apache.org", "sameAs": [ "https://twitter.com/ApacheCamel" ], "logo": "../../_/img/logo-d-a567cee6fa.svg", "description": "Apache Camel ™ is a versatile open-source integration framework based on known Enterprise Integration Patterns. Camel empowers you to define routing and mediation rules in a variety of domain-specific languages, including a Java-based Fluent API, Spring or Blueprint XML Configuration files, and a Scala DSL." } </script> <script type="application/ld+json"> { "@context": "http://schema.org", "@type": "BreadcrumbList", "itemListElement": [{ "@type": "ListItem", "position": 1, "name": "Apache Camel", "item": "https://camel.apache.org/" }, { "@type": "ListItem", "position": 2, "name": "Camel Components", "item": "https://camel.apache.org/components/4.18.x/index.html" }, { "@type": "ListItem", "position": 3, "name": "Next (Pre-release)", "item": "https://camel.apache.org/components/next/index.html" }, { "@type": "ListItem", "position": 4, "name": "Components", "item": "https://camel.apache.org/components/next/index.html" }, { "@type": "ListItem", "position": 5, "name": "gRPC", "item": "https://camel.apache.org/components/next/grpc-component.html" }] } </script> </body> </html> |