This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch feature/CAMEL-23789-wave2-multi-dsl-docs in repository https://gitbox.apache.org/repos/asf/camel.git
commit 7102b46a5929ff69e82ccc68ab5866b8486bc443 Author: Claus Ibsen <[email protected]> AuthorDate: Thu Jun 18 12:00:28 2026 +0200 CAMEL-23789: Add multi-DSL tabs to small and large component docs (Wave 2) Co-Authored-By: Claude <[email protected]> Signed-off-by: Claus Ibsen <[email protected]> --- .../src/main/docs/openai-component.adoc | 507 ++++++++++++++++++++ .../src/main/docs/arangodb-component.adoc | 1 - .../main/docs/aws2-kinesis-firehose-component.adoc | 2 +- .../main/docs/azure-storage-queue-component.adoc | 1 + .../src/main/docs/barcode-dataformat.adoc | 2 +- .../camel-bean/src/main/docs/bean-component.adoc | 1 + .../src/main/docs/crypto-component.adoc | 4 +- .../camel-csv/src/main/docs/csv-dataformat.adoc | 41 +- .../src/main/docs/cxf-component.adoc | 24 +- .../camel-ftp/src/main/docs/sftp-component.adoc | 2 + .../src/main/docs/google-firestore-component.adoc | 81 +++- .../src/main/docs/google-functions-component.adoc | 2 + .../main/docs/google-speech-to-text-component.adoc | 2 + .../src/main/docs/google-storage-component.adoc | 2 + .../main/docs/google-text-to-speech-component.adoc | 2 + .../src/main/docs/google-vision-component.adoc | 2 + .../camel-grok/src/main/docs/grok-dataformat.adoc | 31 +- .../main/docs/hazelcast-atomicvalue-component.adoc | 178 ++++--- .../main/docs/hazelcast-multimap-component.adoc | 116 +++-- .../main/docs/hazelcast-pncounter-component.adoc | 175 ++++--- .../docs/hazelcast-replicatedmap-component.adoc | 88 +++- .../main/docs/hazelcast-ringbuffer-component.adoc | 23 +- .../src/main/docs/hazelcast-seda-component.adoc | 60 ++- .../src/main/docs/kubernetes-summary.adoc | 10 +- .../camel-minio/src/main/docs/minio-component.adoc | 1 + .../src/main/docs/netty-http-component.adoc | 1 + .../src/main/docs/reactive-streams-component.adoc | 56 +++ .../src/main/docs/salesforce-component.adoc | 2 + .../camel-seda/src/main/docs/seda-component.adoc | 2 + .../src/main/docs/spring-ai-chat-component.adoc | 521 +++++++++++++++++++++ .../src/main/docs/spring-rabbitmq-component.adoc | 23 + .../src/main/docs/spring-ws-component.adoc | 130 +++++ .../camel-sql/src/main/docs/sql-component.adoc | 1 + 33 files changed, 1857 insertions(+), 237 deletions(-) diff --git a/components/camel-ai/camel-openai/src/main/docs/openai-component.adoc b/components/camel-ai/camel-openai/src/main/docs/openai-component.adoc index 313dcf2a1de2..a099ef904dfc 100644 --- a/components/camel-ai/camel-openai/src/main/docs/openai-component.adoc +++ b/components/camel-ai/camel-openai/src/main/docs/openai-component.adoc @@ -554,6 +554,11 @@ For full schema validation, integrate with the `camel-json-validator` component === Conversation Memory (Per Exchange) .Usage example: + +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:conversation") @@ -565,6 +570,52 @@ from("direct:conversation") .log("Second response: ${body}"); // Will remember "Alice" ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:conversation"/> + <setBody> + <constant>My name is Alice</constant> + </setBody> + <to uri="openai:chat-completion?conversationMemory=true"/> + <log message="First response: ${body}"/> + <setBody> + <constant>What is my name?</constant> + </setBody> + <to uri="openai:chat-completion?conversationMemory=true"/> + <log message="Second response: ${body}"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:conversation + steps: + - setBody: + constant: "My name is Alice" + - to: + uri: openai:chat-completion + parameters: + conversationMemory: true + - log: + message: "First response: ${body}" + - setBody: + constant: "What is my name?" + - to: + uri: openai:chat-completion + parameters: + conversationMemory: true + - log: + message: "Second response: ${body}" +---- +==== + == Input Handling The component accepts the following types of input in the message body: @@ -722,6 +773,10 @@ YAML:: For two-way authentication, configure both trust store and key store: +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:chat") @@ -734,10 +789,45 @@ from("direct:chat") + "&sslKeyPassword=keypass"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="openai:chat-completion?model=gpt-4&baseUrl=https://my-llm-server:8443/v1&sslTruststoreLocation=/path/to/truststore.jks&sslTruststorePassword=changeit&sslKeystoreLocation=/path/to/keystore.jks&sslKeystorePassword=changeit&sslKeyPassword=keypass"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: openai:chat-completion + parameters: + model: gpt-4 + baseUrl: https://my-llm-server:8443/v1 + sslTruststoreLocation: /path/to/truststore.jks + sslTruststorePassword: changeit + sslKeystoreLocation: /path/to/keystore.jks + sslKeystorePassword: changeit + sslKeyPassword: keypass +---- +==== + === Disabling Hostname Verification In development or test environments, hostname verification can be disabled by setting `sslEndpointAlgorithm` to an empty string or `none`: +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:chat") @@ -748,6 +838,35 @@ from("direct:chat") + "&sslEndpointAlgorithm=none"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="openai:chat-completion?model=gpt-4&baseUrl=https://localhost:8443/v1&sslTruststoreLocation=/path/to/truststore.jks&sslTruststorePassword=changeit&sslEndpointAlgorithm=none"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: openai:chat-completion + parameters: + model: gpt-4 + baseUrl: https://localhost:8443/v1 + sslTruststoreLocation: /path/to/truststore.jks + sslTruststorePassword: changeit + sslEndpointAlgorithm: none +---- +==== + WARNING: Disabling hostname verification is insecure and should only be used in non-production environments. === SSL Parameters @@ -779,6 +898,10 @@ This is independent from the inline `<think>...</think>` tag stripping controlle * `CamelOpenAIReasoningContent` — from the API-level `reasoning_content` field * `CamelOpenAIThinkingContent` — from inline `<think>` tags in the `content` field (requires `stripThinking=true`) +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:chat") @@ -788,6 +911,41 @@ from("direct:chat") .log("Thinking: ${header.CamelOpenAIThinkingContent}"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="openai:chat-completion?model=qwen3&stripThinking=true"/> + <log message="Answer: ${body}"/> + <log message="Reasoning: ${header.CamelOpenAIReasoningContent}"/> + <log message="Thinking: ${header.CamelOpenAIThinkingContent}"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: openai:chat-completion + parameters: + model: qwen3 + stripThinking: true + - log: + message: "Answer: ${body}" + - log: + message: "Reasoning: ${header.CamelOpenAIReasoningContent}" + - log: + message: "Thinking: ${header.CamelOpenAIThinkingContent}" +---- +==== + NOTE: Reasoning content extraction is supported in non-streaming mode only (both simple and agentic/MCP tool loop paths). Streaming responses do not extract reasoning content. === Mapping Additional Response Fields to Headers @@ -796,6 +954,10 @@ The `additionalResponseHeader` option allows mapping any extra field from the AP The key is the field name in the API response, and the value is the Camel header name to set: +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:chat") @@ -805,6 +967,36 @@ from("direct:chat") .log("Custom reasoning: ${header.CamelMyReasoning}"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="openai:chat-completion?model=qwen3&additionalResponseHeader.reasoning_content=CamelMyReasoning&additionalResponseHeader.custom_field=CamelMyCustomField"/> + <log message="Custom reasoning: ${header.CamelMyReasoning}"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: openai:chat-completion + parameters: + model: qwen3 + additionalResponseHeader.reasoning_content: CamelMyReasoning + additionalResponseHeader.custom_field: CamelMyCustomField + - log: + message: "Custom reasoning: ${header.CamelMyReasoning}" +---- +==== + String-valued fields are set directly. Non-string fields (numbers, booleans, objects) are converted using `toString()`. NOTE: This maps fields from the response message's additional properties (fields not part of the standard schema). Standard response fields like `content`, `role`, and `tool_calls` are not accessible through this option. @@ -871,12 +1063,42 @@ Provider* table below). https://lmstudio.ai[LM Studio] serves the model currently loaded in the app. Set `model` to the identifier shown in its UI. +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:chat") .to("openai:chat-completion?baseUrl=http://localhost:1234/v1&model=local-model"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="openai:chat-completion?baseUrl=http://localhost:1234/v1&model=local-model"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: openai:chat-completion + parameters: + baseUrl: http://localhost:1234/v1 + model: local-model +---- +==== + === vLLM (self-hosted) https://docs.vllm.ai[vLLM] is a high-throughput LLM serving engine. Install it with `pip install vllm` @@ -887,6 +1109,10 @@ and start the model used in the example below: vllm serve meta-llama/Llama-3.1-8B-Instruct --port 8000 ---- +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:chat") @@ -894,6 +1120,32 @@ from("direct:chat") + "&model=meta-llama/Llama-3.1-8B-Instruct"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="openai:chat-completion?baseUrl=http://localhost:8000/v1&model=meta-llama/Llama-3.1-8B-Instruct"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: openai:chat-completion + parameters: + baseUrl: http://localhost:8000/v1 + model: meta-llama/Llama-3.1-8B-Instruct +---- +==== + If vLLM was started with `--api-key`, pass the same value via the `apiKey` option. On Apple Silicon, the `vllm-mlx` variant uses Apple's MLX framework and runs the same way: @@ -908,6 +1160,10 @@ vllm-mlx serve mlx-community/Qwen2.5-7B-Instruct-4bit --port 8000 https://openrouter.ai[OpenRouter] is an OpenAI-compatible gateway that routes requests across many model providers. Set `baseUrl` to its endpoint and select a model with a cross-provider identifier: +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:chat") @@ -916,6 +1172,33 @@ from("direct:chat") + "&model=anthropic/claude-sonnet-4-20250514"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="openai:chat-completion?baseUrl=https://openrouter.ai/api/v1&apiKey={{openrouter.api.key}}&model=anthropic/claude-sonnet-4-20250514"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: openai:chat-completion + parameters: + baseUrl: https://openrouter.ai/api/v1 + apiKey: "{{openrouter.api.key}}" + model: anthropic/claude-sonnet-4-20250514 +---- +==== + ==== Provider Routing OpenRouter accepts a `provider` object in the request body to control routing order and fallbacks. @@ -1216,6 +1499,11 @@ The audio transcription operation works with any OpenAI-compatible server that i * https://github.com/ml-explore/mlx-audio[MLX Audio] — `python3 -m mlx_audio.server --host 127.0.0.1 --port 8003` .Example using MLX Audio for local transcription: + +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:transcribe") @@ -1223,6 +1511,32 @@ from("direct:transcribe") + "&baseUrl=http://localhost:8003/v1"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:transcribe"/> + <to uri="openai:audio-transcription?audioModel=mlx-community/whisper-large-v3-turbo&baseUrl=http://localhost:8003/v1"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:transcribe + steps: + - to: + uri: openai:audio-transcription + parameters: + audioModel: mlx-community/whisper-large-v3-turbo + baseUrl: http://localhost:8003/v1 +---- +==== + [NOTE] ==== Some local servers require the model parameter to be a path (e.g., `./models/granite-speech-4.1-2b-8bit`). Refer to your server's documentation for the expected model identifier format. @@ -1238,6 +1552,10 @@ MCP servers are configured inline on the endpoint URI using the `mcpServer.` pre ==== Streamable HTTP Transport +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:chat") @@ -1246,8 +1564,39 @@ from("direct:chat") + "&mcpServer.api.url=http://localhost:9090/mcp"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="openai:chat-completion?model=gpt-4&mcpServer.api.transportType=streamableHttp&mcpServer.api.url=http://localhost:9090/mcp"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: openai:chat-completion + parameters: + model: gpt-4 + mcpServer.api.transportType: streamableHttp + mcpServer.api.url: http://localhost:9090/mcp +---- +==== + ==== SSE Transport (Deprecated) +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:chat") @@ -1256,8 +1605,39 @@ from("direct:chat") + "&mcpServer.weather.url=http://localhost:8080"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="openai:chat-completion?model=gpt-4&mcpServer.weather.transportType=sse&mcpServer.weather.url=http://localhost:8080"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: openai:chat-completion + parameters: + model: gpt-4 + mcpServer.weather.transportType: sse + mcpServer.weather.url: http://localhost:8080 +---- +==== + ==== Stdio Transport +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:chat") @@ -1267,6 +1647,34 @@ from("direct:chat") + "&mcpServer.fs.args=-y,@modelcontextprotocol/server-filesystem,/tmp"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="openai:chat-completion?model=gpt-4&mcpServer.fs.transportType=stdio&mcpServer.fs.command=npx&mcpServer.fs.args=-y,@modelcontextprotocol/server-filesystem,/tmp"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: openai:chat-completion + parameters: + model: gpt-4 + mcpServer.fs.transportType: stdio + mcpServer.fs.command: npx + mcpServer.fs.args: "-y,@modelcontextprotocol/server-filesystem,/tmp" +---- +==== + ==== Multiple MCP Servers Multiple servers can be configured on the same endpoint. Tools from all servers are merged and made available to the model: @@ -1320,6 +1728,10 @@ The `maxToolIterations` option (default: 50) prevents infinite loops. If exceede Set `autoToolExecution=false` to disable the agentic loop and receive raw tool calls in the message body instead: +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:chat") @@ -1330,6 +1742,37 @@ from("direct:chat") .log("Tool calls: ${body}"); // body is the raw tool calls list ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="openai:chat-completion?model=gpt-4&autoToolExecution=false&mcpServer.api.transportType=streamableHttp&mcpServer.api.url=http://localhost:9090/mcp"/> + <log message="Tool calls: ${body}"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: openai:chat-completion + parameters: + model: gpt-4 + autoToolExecution: false + mcpServer.api.transportType: streamableHttp + mcpServer.api.url: http://localhost:9090/mcp + - log: + message: "Tool calls: ${body}" +---- +==== + === Manual Tool Loop with `tool-execution` Operation When `autoToolExecution=false`, you can implement your own tool loop using the `openai:tool-execution` operation and Camel's `loopDoWhile` EIP. This gives you full control to add logging, filtering, retry logic, or custom routing between tool calls — without writing any Java code. @@ -1513,6 +1956,10 @@ NOTE: When `systemMessage` is set and `conversationMemory` is enabled, the conve When using the Streamable HTTP transport, the component advertises MCP protocol versions during initialization. By default, the SDK's built-in versions are used. If your MCP server does not support the latest protocol version, you can restrict the advertised versions: +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:chat") @@ -1522,6 +1969,34 @@ from("direct:chat") + "&mcpProtocolVersions=2024-11-05,2025-03-26,2025-06-18"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="openai:chat-completion?model=gpt-4&mcpServer.api.transportType=streamableHttp&mcpServer.api.url=http://localhost:9090/mcp&mcpProtocolVersions=2024-11-05,2025-03-26,2025-06-18"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: openai:chat-completion + parameters: + model: gpt-4 + mcpServer.api.transportType: streamableHttp + mcpServer.api.url: http://localhost:9090/mcp + mcpProtocolVersions: "2024-11-05,2025-03-26,2025-06-18" +---- +==== + === MCP Connection Recovery When `mcpReconnect=true` (the default), the component automatically recovers from MCP server connection failures. If a tool call fails with a transport error, the component: @@ -1535,6 +2010,10 @@ This handles scenarios where an MCP server restarts, a network connection drops, Set `mcpReconnect=false` to disable automatic recovery: +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:chat") @@ -1544,6 +2023,34 @@ from("direct:chat") + "&mcpServer.api.url=http://localhost:9090/mcp"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="openai:chat-completion?model=gpt-4&mcpReconnect=false&mcpServer.api.transportType=streamableHttp&mcpServer.api.url=http://localhost:9090/mcp"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: openai:chat-completion + parameters: + model: gpt-4 + mcpReconnect: false + mcpServer.api.transportType: streamableHttp + mcpServer.api.url: http://localhost:9090/mcp +---- +==== + === Error Handling in the Agentic Loop [cols="1,3"] diff --git a/components/camel-arangodb/src/main/docs/arangodb-component.adoc b/components/camel-arangodb/src/main/docs/arangodb-component.adoc index 43abeee79063..d549b0ee27bf 100644 --- a/components/camel-arangodb/src/main/docs/arangodb-component.adoc +++ b/components/camel-arangodb/src/main/docs/arangodb-component.adoc @@ -32,7 +32,6 @@ for this component: == URI format -[source,java] ---- arangodb:database[?options] ---- diff --git a/components/camel-aws/camel-aws2-kinesis/src/main/docs/aws2-kinesis-firehose-component.adoc b/components/camel-aws/camel-aws2-kinesis/src/main/docs/aws2-kinesis-firehose-component.adoc index 9e7802fdeb28..4a53db61ca97 100644 --- a/components/camel-aws/camel-aws2-kinesis/src/main/docs/aws2-kinesis-firehose-component.adoc +++ b/components/camel-aws/camel-aws2-kinesis/src/main/docs/aws2-kinesis-firehose-component.adoc @@ -25,7 +25,7 @@ at https://aws.amazon.com/kinesis/firehose/[AWS Kinesis Firehose] == URI Format -[source,java] +[source,text] ---- aws2-kinesis-firehose://delivery-stream-name[?options] ---- diff --git a/components/camel-azure/camel-azure-storage-queue/src/main/docs/azure-storage-queue-component.adoc b/components/camel-azure/camel-azure-storage-queue/src/main/docs/azure-storage-queue-component.adoc index 310d4d12a954..c0077e850ff6 100644 --- a/components/camel-azure/camel-azure-storage-queue/src/main/docs/azure-storage-queue-component.adoc +++ b/components/camel-azure/camel-azure-storage-queue/src/main/docs/azure-storage-queue-component.adoc @@ -116,6 +116,7 @@ If your Camel Application is running behind a firewall or if you need to have more control over the `QueueServiceClient` instance configuration, you can create your own instance: +._Java-only: programmatic Azure SDK client configuration_ [source,java] ---- StorageSharedKeyCredential credential = new StorageSharedKeyCredential("yourAccountName", "yourAccessKey"); diff --git a/components/camel-barcode/src/main/docs/barcode-dataformat.adoc b/components/camel-barcode/src/main/docs/barcode-dataformat.adoc index 6305dbed2bf1..6e0cebc7fb45 100644 --- a/components/camel-barcode/src/main/docs/barcode-dataformat.adoc +++ b/components/camel-barcode/src/main/docs/barcode-dataformat.adoc @@ -26,7 +26,7 @@ If you use maven, you could just add the following to your pom.xml, substituting the version number for the latest & greatest release (see the download page for the latest versions). -[source,java] +[source,xml] ---- <dependency> <groupId>org.apache.camel</groupId> diff --git a/components/camel-bean/src/main/docs/bean-component.adoc b/components/camel-bean/src/main/docs/bean-component.adoc index ad7bdc23ad46..63c30001b2b0 100644 --- a/components/camel-bean/src/main/docs/bean-component.adoc +++ b/components/camel-bean/src/main/docs/bean-component.adoc @@ -39,6 +39,7 @@ Endpoint to the bean endpoint as output, such as the *direct* endpoint as input. Suppose you have the following POJO class to be used by Camel +._Java-only: POJO bean class used by the route_ [source,java] ---- package com.foo; diff --git a/components/camel-crypto/src/main/docs/crypto-component.adoc b/components/camel-crypto/src/main/docs/crypto-component.adoc index 5cecd3be53df..6f2f579a7512 100644 --- a/components/camel-crypto/src/main/docs/crypto-component.adoc +++ b/components/camel-crypto/src/main/docs/crypto-component.adoc @@ -194,11 +194,12 @@ YAML:: The following code shows how to load the keystore created using the above `keytool` command and bind it into the registry with the name `myKeystore` for use in the above route. The example makes use of the `@Configuration` and `@BindToRegistry` annotations introduced in Camel 3 to instantiate the KeyStore and register it with the name `myKeyStore`. +._Java-only: KeyStore bean configuration with `@BindToRegistry`_ [source,java] ---- @Configuration public class KeystoreConfig { - + @BindToRegistry public KeyStore myKeystore() throws Exception { KeyStore store = KeyStore.getInstance("JKS"); @@ -342,6 +343,7 @@ Add the Bouncy Castle provider dependencies to your project: Register the Bouncy Castle provider at application startup: +._Java-only: static provider registration_ [source,java] ---- import org.bouncycastle.jce.provider.BouncyCastleProvider; diff --git a/components/camel-csv/src/main/docs/csv-dataformat.adoc b/components/camel-csv/src/main/docs/csv-dataformat.adoc index 3ee3b6950e74..86e8c07fd358 100644 --- a/components/camel-csv/src/main/docs/csv-dataformat.adoc +++ b/components/camel-csv/src/main/docs/csv-dataformat.adoc @@ -202,16 +202,49 @@ public void doHandleCsvData(List<List<String>> csvData) ... your route then looks as follows +[tabs] +==== +Java:: ++ +[source,java] +---- +from("file:///some/path/to/pickup/csvfiles?delete=true&delay=10000") + .unmarshal().csv() + .to("bean:myCsvHandler?method=doHandleCsvData"); +---- + +XML:: ++ [source,xml] ---- <route> - <!-- poll every 10 seconds --> - <from uri="file:///some/path/to/pickup/csvfiles?delete=true&delay=10000" /> - <unmarshal><csv /></unmarshal> - <to uri="bean:myCsvHandler?method=doHandleCsvData" /> + <!-- poll every 10 seconds --> + <from uri="file:///some/path/to/pickup/csvfiles?delete=true&delay=10000"/> + <unmarshal><csv/></unmarshal> + <to uri="bean:myCsvHandler?method=doHandleCsvData"/> </route> ---- +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: file:///some/path/to/pickup/csvfiles + parameters: + delete: true + delay: 10000 + steps: + - unmarshal: + csv: {} + - to: + uri: bean:myCsvHandler + parameters: + method: doHandleCsvData +---- +==== + === Marshaling with a pipe as delimiter Considering the following body: diff --git a/components/camel-cxf/camel-cxf-soap/src/main/docs/cxf-component.adoc b/components/camel-cxf/camel-cxf-soap/src/main/docs/cxf-component.adoc index 00b044e2a750..2856107081e9 100644 --- a/components/camel-cxf/camel-cxf-soap/src/main/docs/cxf-component.adoc +++ b/components/camel-cxf/camel-cxf-soap/src/main/docs/cxf-component.adoc @@ -225,10 +225,7 @@ is removed in `RAW` mode), you have to configure `LoggingOutInterceptor` to be run during the `WRITE` phase. The following is an example. -[tabs] -==== -Java (Quarkus):: -+ +._Java-only: configuring `LoggingOutInterceptor` in the WRITE phase for RAW mode_ [source,java] ---- import java.util.List; @@ -256,8 +253,8 @@ CxfEndpoint soapMtomEnabledServerPayloadModeEndpoint() { } ---- -XML (Spring):: -+ +The same configuration in Spring XML: + [source,xml] ---- <bean id="loggingOutInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"> @@ -275,7 +272,6 @@ XML (Spring):: </cxf:properties> </cxf:cxfEndpoint> ---- -==== === Description of CxfHeaderFilterStrategy options @@ -411,6 +407,7 @@ Error:sendSms: SoapFault exception: [Client] looks like we got no XML document i To resolve this issue, you need to tell `StaxOutInterceptor` to write the XML start document for you, as in the https://github.com/apache/camel/blob/main/components/camel-cxf/camel-cxf-soap/src/test/java/org/apache/camel/component/cxf/jaxws/WriteXmlDeclarationInterceptor.java[WriteXmlDeclarationInterceptor] below: +._Java-only: CXF interceptor to force XML declaration in response_ [source,java] ---- public class WriteXmlDeclarationInterceptor extends AbstractPhaseInterceptor<SoapMessage> { @@ -428,6 +425,7 @@ public class WriteXmlDeclarationInterceptor extends AbstractPhaseInterceptor<Soa As an alternative, you can add a message header for it as demonstrated in https://github.com/apache/camel/blob/main/components/camel-cxf/camel-cxf-soap/src/test/java/org/apache/camel/component/cxf/jaxws/CxfConsumerTest.java#L62[CxfConsumerTest]: +._Java-only: forcing XML declaration via response context header_ [source,java] ---- // set up the response context which force start document @@ -580,7 +578,7 @@ operation parameters. Having simple java web service interface: - +._Java-only: JAX-WS web service interface definition_ [source,java] ---- package org.apache.camel.component.cxf.soap.server; @@ -633,6 +631,7 @@ list. If you want to get the object array from the message body, you can get the body using `message.getBody(Object[].class)`, as shown in https://github.com/apache/camel/blob/main/components/camel-cxf/camel-cxf-soap/src/test/java/org/apache/camel/component/cxf/jaxws/CxfProducerRouterTest.java#L117[CxfProducerRouterTest.testInvokingSimpleServerWithParams]: +._Java-only: preparing and sending a POJO mode request with `ProducerTemplate`_ [source,java] ---- Exchange senderExchange = new DefaultExchange(context, ExchangePattern.InOut); @@ -666,6 +665,7 @@ for SOAP message headers and the SOAP body. See https://github.com/apache/camel/blob/main/components/camel-cxf/camel-cxf-soap/src/test/java/org/apache/camel/component/cxf/jaxws/CxfConsumerPayloadTest.java#L68[CxfConsumerPayloadTest]: +._Java-only: consuming and processing CXF PAYLOAD with `CxfPayload` API_ [source,java] ---- protected RouteBuilder createRouteBuilder() { @@ -777,6 +777,7 @@ The only difference between the two processors is setting the direction of the i You can find the `InsertResponseOutHeaderProcessor` example in https://github.com/apache/camel/blob/main/components/camel-cxf/camel-cxf-spring-soap/src/test/java/org/apache/camel/component/cxf/soap/headers/CxfMessageHeadersRelayTest.java#L731[CxfMessageHeadersRelayTest]: +._Java-only: Processor that inserts an out-of-band SOAP header into the response_ [source,java] ---- public static class InsertResponseOutHeaderProcessor implements Processor { @@ -812,6 +813,7 @@ headers). For example, see https://github.com/apache/camel/blob/main/components/camel-cxf/camel-cxf-soap/src/test/java/org/apache/camel/component/cxf/jaxws/CxfPayLoadSoapHeaderTest.java#L53[CxfPayLoadSoapHeaderTest]: +._Java-only: accessing SOAP headers from `CxfPayload` in PAYLOAD mode_ [source,java] ---- from(getRouterEndpointURI()).process(new Processor() { @@ -869,6 +871,7 @@ may need to throw the SOAP Fault from the camel context. + `POJO`, `PAYLOAD` and `RAW` data format. + You can define the soap fault as shown in https://github.com/apache/camel/blob/main/components/camel-cxf/camel-cxf-soap/src/test/java/org/apache/camel/component/cxf/jaxws/CxfCustomizedExceptionTest.java#L65[CxfCustomizedExceptionTest]: +._Java-only: creating a `SoapFault` with detail text_ [source,java] ---- SOAP_FAULT = new SoapFault(EXCEPTION_MESSAGE, SoapFault.FAULT_CODE_CLIENT); @@ -880,6 +883,7 @@ detail.appendChild(tn); Then throw it as you like: +._Java-only: setting a SOAP fault on the route using `setFaultBody`_ [source,java] ---- from(routerEndpointURI).setFaultBody(constant(SOAP_FAULT)); @@ -912,6 +916,7 @@ If you are using a Camel CXF endpoint producer to invoke the outside web service, you can set the request context and get response context with the following code: +._Java-only: setting request context and reading response context via `ProducerTemplate`_ [source,java] ---- CxfExchange exchange = (CxfExchange)template.send(getJaxwsEndpointUri(), new Processor() { @@ -947,6 +952,7 @@ Since attachments are marshalled and unmarshalled into POJOs, the attachments sh retrieved from the Apache Camel message body (as a parameter list), and it isn't possible to retrieve attachments by Camel Message API +._Java-only: retrieving an attachment by ID from the exchange_ [source,java] ---- DataHandler handler = Exchange.getIn(AttachmentMessage.class).getAttachment("id"); @@ -1020,6 +1026,7 @@ XML (Spring):: You can produce a Camel message with attachment to send to a CXF endpoint in Payload mode. +._Java-only: sending and receiving MTOM attachments via `ProducerTemplate`_ [source,java] ---- Exchange exchange = context.createProducerTemplate().send("direct:testEndpoint", new Processor() { @@ -1075,6 +1082,7 @@ assertEquals(300, image.getHeight()); You can also consume a Camel message received from a CXF endpoint in Payload mode. The https://github.com/apache/camel/blob/main/components/camel-cxf/camel-cxf-spring-soap/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomConsumerPayloadModeTest.java#L97[CxfMtomConsumerPayloadModeTest] illustrates how this works: +._Java-only: Processor that verifies and responds to MTOM requests_ [source,java] ---- public static class MyProcessor implements Processor { diff --git a/components/camel-ftp/src/main/docs/sftp-component.adoc b/components/camel-ftp/src/main/docs/sftp-component.adoc index 32dd424fad36..fbaa9566ba62 100644 --- a/components/camel-ftp/src/main/docs/sftp-component.adoc +++ b/components/camel-ftp/src/main/docs/sftp-component.adoc @@ -46,6 +46,7 @@ WARNING: By default, the SFTP component has `strictHostKeyChecking=no`, which di You can configure host key verification settings globally on the SFTP component, which will apply to all SFTP endpoints unless overridden at the endpoint level: +._Java-only: programmatic `SftpComponent` configuration via `CamelContext`_ [source,java] ---- // Configure component for all SFTP endpoints @@ -295,6 +296,7 @@ If you need to control the CA signature algorithms that JSch will accept, use th As of Camel 3.17.0, key types and algorithms that use SHA1 have been deprecated. These can be restored, if necessary, by setting JSch configuration directly. E.g.: +._Java-only: restoring deprecated JSch key types and algorithms_ [source,java] ---- JSch.setConfig("server_host_key", JSch.getConfig("server_host_key") + ",ssh-rsa"); diff --git a/components/camel-google/camel-google-firestore/src/main/docs/google-firestore-component.adoc b/components/camel-google/camel-google-firestore/src/main/docs/google-firestore-component.adoc index 39c4f7c542b0..f4299bc056a9 100644 --- a/components/camel-google/camel-google-firestore/src/main/docs/google-firestore-component.adoc +++ b/components/camel-google/camel-google-firestore/src/main/docs/google-firestore-component.adoc @@ -43,6 +43,8 @@ For more information, please refer to https://cloud.google.com/firestore/docs/qu When you have the **service account key**, you can provide authentication credentials to your application code. Google security credentials can be set through the component endpoint: +._Java-only: constructing the endpoint URI programmatically_ + [source,java] ---- String endpoint = "google-firestore://myCollection?serviceAccountKey=/home/user/Downloads/my-key.json&projectId=my-project"; @@ -950,6 +952,8 @@ For write operations (`setDocument`, `createDocument`, `updateDocument`), the co You can send a JSON string directly as the message body. The component will automatically parse it: +._Java-only: JSON string input with text blocks_ + [source,java] ---- // Simple JSON @@ -981,25 +985,98 @@ from("direct:start") ==== Reading JSON from Files +[tabs] +==== +Java:: ++ [source,java] ---- -// Read JSON files and store in Firestore from("file:data/users?noop=true&include=.*\\.json") .setHeader("CamelGoogleFirestoreDocumentId", simple("${file:name.noext}")) .to("google-firestore://users?operation=setDocument") .log("Imported: ${file:name}"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="file:data/users?noop=true&include=.*\.json"/> + <setHeader name="CamelGoogleFirestoreDocumentId"> + <simple>${file:name.noext}</simple> + </setHeader> + <to uri="google-firestore://users?operation=setDocument"/> + <log message="Imported: ${file:name}"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: file:data/users + parameters: + noop: true + include: ".*\\.json" + steps: + - setHeader: + name: CamelGoogleFirestoreDocumentId + simple: "${file:name.noext}" + - to: + uri: google-firestore://users + parameters: + operation: setDocument + - log: + message: "Imported: ${file:name}" +---- +==== + ==== REST API Integration +[tabs] +==== +Java:: ++ [source,java] ---- -// Receive JSON from REST endpoint and store in Firestore from("rest:post:/api/users") .to("google-firestore://users?operation=createDocument") .setBody(simple("{\"id\": \"${header.CamelGoogleFirestoreResponseDocumentId}\"}")); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="rest:post:/api/users"/> + <to uri="google-firestore://users?operation=createDocument"/> + <setBody> + <simple>{"id": "${header.CamelGoogleFirestoreResponseDocumentId}"}</simple> + </setBody> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: rest:post:/api/users + steps: + - to: + uri: google-firestore://users + parameters: + operation: createDocument + - setBody: + simple: '{"id": "${header.CamelGoogleFirestoreResponseDocumentId}"}' +---- +==== + === Supported Firestore Data Types The following Java types are automatically converted to Firestore data types: diff --git a/components/camel-google/camel-google-functions/src/main/docs/google-functions-component.adoc b/components/camel-google/camel-google-functions/src/main/docs/google-functions-component.adoc index c9c5cb5f9dc7..351729c08636 100644 --- a/components/camel-google/camel-google-functions/src/main/docs/google-functions-component.adoc +++ b/components/camel-google/camel-google-functions/src/main/docs/google-functions-component.adoc @@ -42,6 +42,8 @@ For more information, please refer to https://github.com/googleapis/google-cloud When you have the **service account key**, you can provide authentication credentials to your application code. Google security credentials can be set through the component endpoint: +._Java-only: constructing the endpoint URI programmatically_ + [source,java] ---- String endpoint = "google-functions://myCamelFunction?serviceAccountKey=/home/user/Downloads/my-key.json"; diff --git a/components/camel-google/camel-google-speech-to-text/src/main/docs/google-speech-to-text-component.adoc b/components/camel-google/camel-google-speech-to-text/src/main/docs/google-speech-to-text-component.adoc index a42ce8b8ac2c..14fbe59d5307 100644 --- a/components/camel-google/camel-google-speech-to-text/src/main/docs/google-speech-to-text-component.adoc +++ b/components/camel-google/camel-google-speech-to-text/src/main/docs/google-speech-to-text-component.adoc @@ -41,6 +41,8 @@ For more information, please refer to https://github.com/googleapis/google-cloud When you have the **service account key**, you can provide authentication credentials to your application code. Google security credentials can be set through the component endpoint: +._Java-only: constructing the endpoint URI programmatically_ + [source,java] ---- String endpoint = "google-speech-to-text://recognize?serviceAccountKey=/home/user/Downloads/my-key.json"; diff --git a/components/camel-google/camel-google-storage/src/main/docs/google-storage-component.adoc b/components/camel-google/camel-google-storage/src/main/docs/google-storage-component.adoc index dd0e96351cd4..96c4463960de 100644 --- a/components/camel-google/camel-google-storage/src/main/docs/google-storage-component.adoc +++ b/components/camel-google/camel-google-storage/src/main/docs/google-storage-component.adoc @@ -41,6 +41,8 @@ For more information, please refer to https://cloud.google.com/storage/docs/refe When you have the **service account key**, you can provide authentication credentials to your application code. Google security credentials can be set through the component endpoint: +._Java-only: constructing the endpoint URI programmatically_ + [source,java] ---- String endpoint = "google-storage://myCamelBucket?serviceAccountKey=/home/user/Downloads/my-key.json"; diff --git a/components/camel-google/camel-google-text-to-speech/src/main/docs/google-text-to-speech-component.adoc b/components/camel-google/camel-google-text-to-speech/src/main/docs/google-text-to-speech-component.adoc index cec136eb76d5..2ee5c0d92b94 100644 --- a/components/camel-google/camel-google-text-to-speech/src/main/docs/google-text-to-speech-component.adoc +++ b/components/camel-google/camel-google-text-to-speech/src/main/docs/google-text-to-speech-component.adoc @@ -41,6 +41,8 @@ For more information, please refer to https://github.com/googleapis/google-cloud When you have the **service account key**, you can provide authentication credentials to your application code. Google security credentials can be set through the component endpoint: +._Java-only: constructing the endpoint URI programmatically_ + [source,java] ---- String endpoint = "google-text-to-speech://synthesize?serviceAccountKey=/home/user/Downloads/my-key.json"; diff --git a/components/camel-google/camel-google-vision/src/main/docs/google-vision-component.adoc b/components/camel-google/camel-google-vision/src/main/docs/google-vision-component.adoc index 8b4a167fb762..dc9334eda68f 100644 --- a/components/camel-google/camel-google-vision/src/main/docs/google-vision-component.adoc +++ b/components/camel-google/camel-google-vision/src/main/docs/google-vision-component.adoc @@ -41,6 +41,8 @@ For more information, please refer to https://github.com/googleapis/google-cloud When you have the **service account key**, you can provide authentication credentials to your application code. Google security credentials can be set through the component endpoint: +._Java-only: constructing the endpoint URI programmatically_ + [source,java] ---- String endpoint = "google-vision://labelDetection?serviceAccountKey=/home/user/Downloads/my-key.json"; diff --git a/components/camel-grok/src/main/docs/grok-dataformat.adoc b/components/camel-grok/src/main/docs/grok-dataformat.adoc index 1c6abedf63b8..113da6f8df52 100644 --- a/components/camel-grok/src/main/docs/grok-dataformat.adoc +++ b/components/camel-grok/src/main/docs/grok-dataformat.adoc @@ -132,13 +132,9 @@ All https://github.com/thekrakken/java-grok/tree/master/src/main/resources/patte Camel Grok DataFormat supports plugable patterns, which are auto loaded from Camel Registry. You can register patterns with Java DSL and Spring DSL: -[tabs] -==== - -Java DSL:: -+ +._Java-only: registering a custom Grok pattern in a `RouteBuilder`_ [source,java] --------------------------------------------------------------------------------- +---- public class MyRouteBuilder extends RouteBuilder { @Override @@ -150,30 +146,19 @@ public class MyRouteBuilder extends RouteBuilder { .to("log:out"); } } --------------------------------------------------------------------------------- +---- + +In Spring XML, you register the custom pattern as a bean: -Spring XML:: -+ [source,xml] --------------------------------------------------------------------------------- +---- <beans> <bean id="myCustomPatternBean" class="org.apache.camel.component.grok.GrokPattern"> <constructor-arg value="FOOBAR"/> <constructor-arg value="foo|bar"/> </bean> -<beans> -<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> - <route> - <from uri="direct:in"/> - <unmarshal> - <grok pattern="%{FOOBAR:fooBar}"/> - </unmarshal> - <to uri="log:out"/> - </route> -</camelContext> --------------------------------------------------------------------------------- - -==== +</beans> +---- == Grok Data format Options diff --git a/components/camel-hazelcast/src/main/docs/hazelcast-atomicvalue-component.adoc b/components/camel-hazelcast/src/main/docs/hazelcast-atomicvalue-component.adoc index d5d45c1faa03..e94c5c2a444d 100644 --- a/components/camel-hazelcast/src/main/docs/hazelcast-atomicvalue-component.adoc +++ b/components/camel-hazelcast/src/main/docs/hazelcast-atomicvalue-component.adoc @@ -51,29 +51,42 @@ The operations for this producer are: [tabs] ==== - -Java DSL:: +Java:: + [source,java] ------------------------------------------------------------------------------------------ +---- from("direct:set") -.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.SET_VALUE)) -.toF("hazelcast-%sfoo", HazelcastConstants.ATOMICNUMBER_PREFIX); ------------------------------------------------------------------------------------------ + .setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.SET_VALUE)) + .toF("hazelcast-%sfoo", HazelcastConstants.ATOMICNUMBER_PREFIX); +---- -Spring XML:: +XML:: + [source,xml] ------------------------------------------------------------------------------------------------ +---- <route> - <from uri="direct:set" /> + <from uri="direct:set"/> <setHeader name="hazelcast.operation.type"> <constant>setvalue</constant> </setHeader> - <to uri="hazelcast-atomicvalue:foo" /> + <to uri="hazelcast-atomicvalue:foo"/> </route> ------------------------------------------------------------------------------------------------ +---- +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:set + steps: + - setHeader: + name: hazelcast.operation.type + constant: setvalue + - to: + uri: hazelcast-atomicvalue:foo +---- ==== Provide the value to set inside the message body (here the value is 10): @@ -83,29 +96,42 @@ Provide the value to set inside the message body (here the value is 10): [tabs] ==== - -Java DSL:: +Java:: + [source,java] ------------------------------------------------------------------------------------- +---- from("direct:get") -.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.GET)) -.toF("hazelcast-%sfoo", HazelcastConstants.ATOMICNUMBER_PREFIX); ------------------------------------------------------------------------------------- + .setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.GET)) + .toF("hazelcast-%sfoo", HazelcastConstants.ATOMICNUMBER_PREFIX); +---- -Spring XML:: +XML:: + [source,xml] ------------------------------------------------------------------------------------------------ +---- <route> - <from uri="direct:get" /> + <from uri="direct:get"/> <setHeader name="hazelcast.operation.type"> <constant>get</constant> </setHeader> - <to uri="hazelcast-atomicvalue:foo" /> + <to uri="hazelcast-atomicvalue:foo"/> </route> ------------------------------------------------------------------------------------------------ +---- +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:get + steps: + - setHeader: + name: hazelcast.operation.type + constant: get + - to: + uri: hazelcast-atomicvalue:foo +---- ==== You can get the number with @@ -115,30 +141,42 @@ You can get the number with [tabs] ==== - -Java DSL:: +Java:: + - [source,java] ------------------------------------------------------------------------------------------- +---- from("direct:increment") -.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.INCREMENT)) -.toF("hazelcast-%sfoo", HazelcastConstants.ATOMICNUMBER_PREFIX); ------------------------------------------------------------------------------------------- + .setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.INCREMENT)) + .toF("hazelcast-%sfoo", HazelcastConstants.ATOMICNUMBER_PREFIX); +---- -Spring XML:: +XML:: + [source,xml] ------------------------------------------------------------------------------------------------ +---- <route> - <from uri="direct:increment" /> + <from uri="direct:increment"/> <setHeader name="hazelcast.operation.type"> <constant>increment</constant> </setHeader> - <to uri="hazelcast-atomicvalue:foo" /> + <to uri="hazelcast-atomicvalue:foo"/> </route> ------------------------------------------------------------------------------------------------ +---- +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:increment + steps: + - setHeader: + name: hazelcast.operation.type + constant: increment + - to: + uri: hazelcast-atomicvalue:foo +---- ==== The actual value (after increment) will be provided inside the message @@ -148,30 +186,42 @@ body. [tabs] ==== - -Java DSL:: +Java:: + - [source,java] ------------------------------------------------------------------------------------------- +---- from("direct:decrement") -.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.DECREMENT)) -.toF("hazelcast-%sfoo", HazelcastConstants.ATOMICNUMBER_PREFIX); ------------------------------------------------------------------------------------------- + .setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.DECREMENT)) + .toF("hazelcast-%sfoo", HazelcastConstants.ATOMICNUMBER_PREFIX); +---- -Spring XML:: +XML:: + [source,xml] ------------------------------------------------------------------------------------------------ +---- <route> - <from uri="direct:decrement" /> + <from uri="direct:decrement"/> <setHeader name="hazelcast.operation.type"> <constant>decrement</constant> </setHeader> - <to uri="hazelcast-atomicvalue:foo" /> + <to uri="hazelcast-atomicvalue:foo"/> </route> ------------------------------------------------------------------------------------------------ +---- +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:decrement + steps: + - setHeader: + name: hazelcast.operation.type + constant: decrement + - to: + uri: hazelcast-atomicvalue:foo +---- ==== The actual value (after decrement) will be provided inside the message @@ -181,30 +231,42 @@ body. [tabs] ==== - -Java DSL:: +Java:: + - [source,java] ----------------------------------------------------------------------------------------- +---- from("direct:destroy") -.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.DESTROY)) -.toF("hazelcast-%sfoo", HazelcastConstants.ATOMICNUMBER_PREFIX); ----------------------------------------------------------------------------------------- + .setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.DESTROY)) + .toF("hazelcast-%sfoo", HazelcastConstants.ATOMICNUMBER_PREFIX); +---- -Spring XML:: +XML:: + [source,xml] ------------------------------------------------------------------------------------------------ +---- <route> - <from uri="direct:destroy" /> + <from uri="direct:destroy"/> <setHeader name="hazelcast.operation.type"> <constant>destroy</constant> </setHeader> - <to uri="hazelcast-atomicvalue:foo" /> + <to uri="hazelcast-atomicvalue:foo"/> </route> ------------------------------------------------------------------------------------------------ +---- +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:destroy + steps: + - setHeader: + name: hazelcast.operation.type + constant: destroy + - to: + uri: hazelcast-atomicvalue:foo +---- ==== include::spring-boot:partial$starter.adoc[] diff --git a/components/camel-hazelcast/src/main/docs/hazelcast-multimap-component.adoc b/components/camel-hazelcast/src/main/docs/hazelcast-multimap-component.adoc index 52a1daf52498..362b12392c02 100644 --- a/components/camel-hazelcast/src/main/docs/hazelcast-multimap-component.adoc +++ b/components/camel-hazelcast/src/main/docs/hazelcast-multimap-component.adoc @@ -46,61 +46,86 @@ The multimap producer provides eight operations: [tabs] ==== - -Java DSL:: +Java:: + [source,java] ---- from("direct:put") -.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.PUT)) -.to(String.format("hazelcast-%sbar", HazelcastConstants.MULTIMAP_PREFIX)); + .setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.PUT)) + .to(String.format("hazelcast-%sbar", HazelcastConstants.MULTIMAP_PREFIX)); ---- -Spring XML:: +XML:: + [source,xml] ---- <route> - <from uri="direct:put" /> + <from uri="direct:put"/> <log message="put.."/> <setHeader name="hazelcast.operation.type"> <constant>put</constant> </setHeader> - <to uri="hazelcast-multimap:foo" /> + <to uri="hazelcast-multimap:foo"/> </route> ---- +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:put + steps: + - setHeader: + name: hazelcast.operation.type + constant: put + - to: + uri: hazelcast-multimap:foo +---- ==== === Example for *removevalue*: [tabs] ==== - -Java DSL:: +Java:: + - [source,java] ---- from("direct:removevalue") -.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.REMOVE_VALUE)) -.toF("hazelcast-%sbar", HazelcastConstants.MULTIMAP_PREFIX); + .setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.REMOVE_VALUE)) + .toF("hazelcast-%sbar", HazelcastConstants.MULTIMAP_PREFIX); ---- -Spring XML:: +XML:: + [source,xml] ---- <route> - <from uri="direct:removevalue" /> + <from uri="direct:removevalue"/> <log message="removevalue..."/> <setHeader name="hazelcast.operation.type"> <constant>removevalue</constant> </setHeader> - <to uri="hazelcast-multimap:foo" /> + <to uri="hazelcast-multimap:foo"/> </route> ---- +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:removevalue + steps: + - setHeader: + name: hazelcast.operation.type + constant: removevalue + - to: + uri: hazelcast-multimap:foo +---- ==== To remove a value you have to provide the value you want to remove @@ -112,66 +137,95 @@ inside the message body to remove the `my-foo` value. [tabs] ==== - -Java DSL:: +Java:: + [source,java] ---- from("direct:get") -.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.GET)) -.toF("hazelcast-%sbar", HazelcastConstants.MULTIMAP_PREFIX) -.to("seda:out"); + .setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.GET)) + .toF("hazelcast-%sbar", HazelcastConstants.MULTIMAP_PREFIX) + .to("seda:out"); ---- -Spring XML:: +XML:: + [source,xml] ---- <route> - <from uri="direct:get" /> + <from uri="direct:get"/> <log message="get.."/> <setHeader name="hazelcast.operation.type"> <constant>get</constant> </setHeader> - <to uri="hazelcast-multimap:foo" /> - <to uri="seda:out" /> + <to uri="hazelcast-multimap:foo"/> + <to uri="seda:out"/> </route> ---- +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:get + steps: + - setHeader: + name: hazelcast.operation.type + constant: get + - to: + uri: hazelcast-multimap:foo + - to: + uri: seda:out +---- ==== === Example for *delete*: [tabs] ==== - -Java DSL:: +Java:: + [source,java] ---- from("direct:delete") -.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.DELETE)) -.toF("hazelcast-%sbar", HazelcastConstants.MULTIMAP_PREFIX); + .setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.DELETE)) + .toF("hazelcast-%sbar", HazelcastConstants.MULTIMAP_PREFIX); ---- -Spring XML:: +XML:: + [source,xml] ---- <route> - <from uri="direct:delete" /> + <from uri="direct:delete"/> <log message="delete.."/> <setHeader name="hazelcast.operation.type"> <constant>delete</constant> </setHeader> - <to uri="hazelcast-multimap:foo" /> + <to uri="hazelcast-multimap:foo"/> </route> ---- +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:delete + steps: + - setHeader: + name: hazelcast.operation.type + constant: delete + - to: + uri: hazelcast-multimap:foo +---- ==== You can call them in your test class with: +._Java-only: uses ProducerTemplate API and Java constants_ [source,java] ---- template.sendBodyAndHeader("direct:[put|get|removevalue|delete]", "my-foo", HazelcastConstants.OBJECT_ID, "4711"); diff --git a/components/camel-hazelcast/src/main/docs/hazelcast-pncounter-component.adoc b/components/camel-hazelcast/src/main/docs/hazelcast-pncounter-component.adoc index 47e9401f0d93..42a569966072 100644 --- a/components/camel-hazelcast/src/main/docs/hazelcast-pncounter-component.adoc +++ b/components/camel-hazelcast/src/main/docs/hazelcast-pncounter-component.adoc @@ -44,29 +44,42 @@ NOTE: PNCounter is a CRDT (Conflict-free Replicated Data Type) that provides eve [tabs] ==== - -Java DSL:: +Java:: + [source,java] ------------------------------------------------------------------------------------------- +---- from("direct:increment") -.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.INCREMENT)) -.toF("hazelcast-%sfoo", HazelcastConstants.PNCOUNTER_PREFIX); ------------------------------------------------------------------------------------------- + .setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.INCREMENT)) + .toF("hazelcast-%sfoo", HazelcastConstants.PNCOUNTER_PREFIX); +---- -Spring XML:: +XML:: + [source,xml] ------------------------------------------------------------------------------------------------ +---- <route> - <from uri="direct:increment" /> + <from uri="direct:increment"/> <setHeader name="hazelcast.operation.type"> <constant>increment</constant> </setHeader> - <to uri="hazelcast-pncounter:foo" /> + <to uri="hazelcast-pncounter:foo"/> </route> ------------------------------------------------------------------------------------------------ +---- +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:increment + steps: + - setHeader: + name: hazelcast.operation.type + constant: increment + - to: + uri: hazelcast-pncounter:foo +---- ==== The actual value (after increment) will be provided inside the message body. @@ -75,29 +88,42 @@ The actual value (after increment) will be provided inside the message body. [tabs] ==== - -Java DSL:: +Java:: + [source,java] ------------------------------------------------------------------------------------------- +---- from("direct:decrement") -.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.DECREMENT)) -.toF("hazelcast-%sfoo", HazelcastConstants.PNCOUNTER_PREFIX); ------------------------------------------------------------------------------------------- + .setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.DECREMENT)) + .toF("hazelcast-%sfoo", HazelcastConstants.PNCOUNTER_PREFIX); +---- -Spring XML:: +XML:: + [source,xml] ------------------------------------------------------------------------------------------------ +---- <route> - <from uri="direct:decrement" /> + <from uri="direct:decrement"/> <setHeader name="hazelcast.operation.type"> <constant>decrement</constant> </setHeader> - <to uri="hazelcast-pncounter:foo" /> + <to uri="hazelcast-pncounter:foo"/> </route> ------------------------------------------------------------------------------------------------ +---- +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:decrement + steps: + - setHeader: + name: hazelcast.operation.type + constant: decrement + - to: + uri: hazelcast-pncounter:foo +---- ==== The actual value (after decrement) will be provided inside the message body. @@ -106,29 +132,42 @@ The actual value (after decrement) will be provided inside the message body. [tabs] ==== - -Java DSL:: +Java:: + [source,java] ------------------------------------------------------------------------------------- +---- from("direct:get") -.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.GET)) -.toF("hazelcast-%sfoo", HazelcastConstants.PNCOUNTER_PREFIX); ------------------------------------------------------------------------------------- + .setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.GET)) + .toF("hazelcast-%sfoo", HazelcastConstants.PNCOUNTER_PREFIX); +---- -Spring XML:: +XML:: + [source,xml] ------------------------------------------------------------------------------------------------ +---- <route> - <from uri="direct:get" /> + <from uri="direct:get"/> <setHeader name="hazelcast.operation.type"> <constant>get</constant> </setHeader> - <to uri="hazelcast-pncounter:foo" /> + <to uri="hazelcast-pncounter:foo"/> </route> ------------------------------------------------------------------------------------------------ +---- +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:get + steps: + - setHeader: + name: hazelcast.operation.type + constant: get + - to: + uri: hazelcast-pncounter:foo +---- ==== You can get the counter value with @@ -138,29 +177,42 @@ You can get the counter value with [tabs] ==== - -Java DSL:: +Java:: + [source,java] ------------------------------------------------------------------------------------- +---- from("direct:getAndAdd") -.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.GET_AND_ADD)) -.toF("hazelcast-%sfoo", HazelcastConstants.PNCOUNTER_PREFIX); ------------------------------------------------------------------------------------- + .setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.GET_AND_ADD)) + .toF("hazelcast-%sfoo", HazelcastConstants.PNCOUNTER_PREFIX); +---- -Spring XML:: +XML:: + [source,xml] ------------------------------------------------------------------------------------------------ +---- <route> - <from uri="direct:getAndAdd" /> + <from uri="direct:getAndAdd"/> <setHeader name="hazelcast.operation.type"> <constant>getAndAdd</constant> </setHeader> - <to uri="hazelcast-pncounter:foo" /> + <to uri="hazelcast-pncounter:foo"/> </route> ------------------------------------------------------------------------------------------------ +---- +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:getAndAdd + steps: + - setHeader: + name: hazelcast.operation.type + constant: getAndAdd + - to: + uri: hazelcast-pncounter:foo +---- ==== Provide the delta value in the message body (e.g., 5 to add 5 to the counter): @@ -172,29 +224,42 @@ The previous value (before the add) will be returned in the message body. [tabs] ==== - -Java DSL:: +Java:: + [source,java] ------------------------------------------------------------------------------------- +---- from("direct:destroy") -.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.DESTROY)) -.toF("hazelcast-%sfoo", HazelcastConstants.PNCOUNTER_PREFIX); ------------------------------------------------------------------------------------- + .setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.DESTROY)) + .toF("hazelcast-%sfoo", HazelcastConstants.PNCOUNTER_PREFIX); +---- -Spring XML:: +XML:: + [source,xml] ------------------------------------------------------------------------------------------------ +---- <route> - <from uri="direct:destroy" /> + <from uri="direct:destroy"/> <setHeader name="hazelcast.operation.type"> <constant>destroy</constant> </setHeader> - <to uri="hazelcast-pncounter:foo" /> + <to uri="hazelcast-pncounter:foo"/> </route> ------------------------------------------------------------------------------------------------ +---- +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:destroy + steps: + - setHeader: + name: hazelcast.operation.type + constant: destroy + - to: + uri: hazelcast-pncounter:foo +---- ==== Destroys the PN Counter instance: diff --git a/components/camel-hazelcast/src/main/docs/hazelcast-replicatedmap-component.adoc b/components/camel-hazelcast/src/main/docs/hazelcast-replicatedmap-component.adoc index 70736f3b62e8..d6819157a30d 100644 --- a/components/camel-hazelcast/src/main/docs/hazelcast-replicatedmap-component.adoc +++ b/components/camel-hazelcast/src/main/docs/hazelcast-replicatedmap-component.adoc @@ -41,91 +41,133 @@ The replicatedmap producer provides 6 operations: [tabs] ==== - -Java DSL:: +Java:: + [source,java] ---- from("direct:put") -.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.PUT)) -.to(String.format("hazelcast-%sbar", HazelcastConstants.REPLICATEDMAP_PREFIX)); + .setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.PUT)) + .to(String.format("hazelcast-%sbar", HazelcastConstants.REPLICATEDMAP_PREFIX)); ---- -Spring XML:: +XML:: + [source,xml] ---- <route> - <from uri="direct:put" /> + <from uri="direct:put"/> <log message="put.."/> <setHeader name="hazelcast.operation.type"> <constant>put</constant> </setHeader> - <to uri="hazelcast-replicatedmap:foo" /> + <to uri="hazelcast-replicatedmap:foo"/> </route> ---- +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:put + steps: + - setHeader: + name: hazelcast.operation.type + constant: put + - to: + uri: hazelcast-replicatedmap:foo +---- ==== === Example for *get*: [tabs] ==== - -Java DSL:: +Java:: + [source,java] ---- from("direct:get") -.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.GET)) -.toF("hazelcast-%sbar", HazelcastConstants.REPLICATEDMAP_PREFIX) -.to("seda:out"); + .setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.GET)) + .toF("hazelcast-%sbar", HazelcastConstants.REPLICATEDMAP_PREFIX) + .to("seda:out"); ---- -Spring XML:: +XML:: + [source,xml] ---- <route> - <from uri="direct:get" /> + <from uri="direct:get"/> <log message="get.."/> <setHeader name="hazelcast.operation.type"> <constant>get</constant> </setHeader> - <to uri="hazelcast-replicatedmap:foo" /> - <to uri="seda:out" /> + <to uri="hazelcast-replicatedmap:foo"/> + <to uri="seda:out"/> </route> ---- +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:get + steps: + - setHeader: + name: hazelcast.operation.type + constant: get + - to: + uri: hazelcast-replicatedmap:foo + - to: + uri: seda:out +---- ==== === Example for *delete*: [tabs] ==== - -Java DSL:: +Java:: + [source,java] ---- from("direct:delete") -.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.DELETE)) -.toF("hazelcast-%sbar", HazelcastConstants.REPLICATEDMAP_PREFIX); + .setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.DELETE)) + .toF("hazelcast-%sbar", HazelcastConstants.REPLICATEDMAP_PREFIX); ---- -Spring XML:: +XML:: + [source,xml] ---- <route> - <from uri="direct:delete" /> + <from uri="direct:delete"/> <log message="delete.."/> <setHeader name="hazelcast.operation.type"> <constant>delete</constant> </setHeader> - <to uri="hazelcast-replicatedmap:foo" /> + <to uri="hazelcast-replicatedmap:foo"/> </route> ---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:delete + steps: + - setHeader: + name: hazelcast.operation.type + constant: delete + - to: + uri: hazelcast-replicatedmap:foo +---- ==== You can call them in your test class with: diff --git a/components/camel-hazelcast/src/main/docs/hazelcast-ringbuffer-component.adoc b/components/camel-hazelcast/src/main/docs/hazelcast-ringbuffer-component.adoc index 58e191553375..506d8d8e5864 100644 --- a/components/camel-hazelcast/src/main/docs/hazelcast-ringbuffer-component.adoc +++ b/components/camel-hazelcast/src/main/docs/hazelcast-ringbuffer-component.adoc @@ -40,8 +40,7 @@ The ringbuffer producer provides 5 operations: [tabs] ==== - -Java DSL:: +Java:: + [source,java] ---- @@ -50,20 +49,34 @@ from("direct:put") .to(String.format("hazelcast-%sbar", HazelcastConstants.RINGBUFFER_PREFIX)); ---- -Spring XML:: +XML:: + [source,xml] ---- <route> - <from uri="direct:put" /> + <from uri="direct:put"/> <log message="put.."/> <setHeader name="hazelcast.operation.type"> <constant>add</constant> </setHeader> - <to uri="hazelcast-ringbuffer:foo" /> + <to uri="hazelcast-ringbuffer:foo"/> </route> ---- +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:put + steps: + - setHeader: + name: hazelcast.operation.type + constant: add + - to: + uri: hazelcast-ringbuffer:foo +---- ==== === Example for *readonce from head*: diff --git a/components/camel-hazelcast/src/main/docs/hazelcast-seda-component.adoc b/components/camel-hazelcast/src/main/docs/hazelcast-seda-component.adoc index b184035e53d2..c88f6166f680 100644 --- a/components/camel-hazelcast/src/main/docs/hazelcast-seda-component.adoc +++ b/components/camel-hazelcast/src/main/docs/hazelcast-seda-component.adoc @@ -33,25 +33,35 @@ specified queue. [tabs] ==== - -Java DSL:: +Java:: + [source,java] --------------------------- +---- from("direct:foo") -.to("hazelcast-seda:foo"); --------------------------- + .to("hazelcast-seda:foo"); +---- -Spring XML:: +XML:: + [source,xml] ----------------------------------- +---- <route> - <from uri="direct:start" /> - <to uri="hazelcast-seda:foo" /> + <from uri="direct:start"/> + <to uri="hazelcast-seda:foo"/> </route> ----------------------------------- +---- +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:foo + steps: + - to: + uri: hazelcast-seda:foo +---- ==== == SEDA consumer – from(“hazelcast-seda:foo”) @@ -61,25 +71,35 @@ the specified queue. [tabs] ==== - -Java DSL:: +Java:: + [source,java] --------------------------- +---- from("hazelcast-seda:foo") -.to("mock:result"); --------------------------- + .to("mock:result"); +---- -Spring XML:: +XML:: + [source,xml] ------------------------------------ +---- <route> - <from uri="hazelcast-seda:foo" /> - <to uri="mock:result" /> + <from uri="hazelcast-seda:foo"/> + <to uri="mock:result"/> </route> ------------------------------------ +---- +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: hazelcast-seda:foo + steps: + - to: + uri: mock:result +---- ==== include::spring-boot:partial$starter.adoc[] diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-summary.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-summary.adoc index 58fb5a9ecf2d..bb86027a8175 100644 --- a/components/camel-kubernetes/src/main/docs/kubernetes-summary.adoc +++ b/components/camel-kubernetes/src/main/docs/kubernetes-summary.adoc @@ -39,21 +39,23 @@ Here we show some examples of producer using camel-kubernetes. === Create a pod +._Java-only: uses toF() with runtime variables for host and auth token_ [source,java] -------------------------------------------------------------- +---- from("direct:createPod") .toF("kubernetes-pods://%s?oauthToken=%s&operation=createPod", host, authToken); -------------------------------------------------------------- +---- By using the `KubernetesConstants.KUBERNETES_POD_SPEC` header, you can specify your PodSpec and pass it to this operation. === Delete a pod +._Java-only: uses toF() with runtime variables for host and auth token_ [source,java] -------------------------------------------------------------- +---- from("direct:createPod") .toF("kubernetes-pods://%s?oauthToken=%s&operation=deletePod", host, authToken); -------------------------------------------------------------- +---- By using the `KubernetesConstants.KUBERNETES_POD_NAME` header, you can specify your Pod name and pass it to this operation. diff --git a/components/camel-minio/src/main/docs/minio-component.adoc b/components/camel-minio/src/main/docs/minio-component.adoc index 987429c05441..0ef22ea9cf33 100644 --- a/components/camel-minio/src/main/docs/minio-component.adoc +++ b/components/camel-minio/src/main/docs/minio-component.adoc @@ -695,6 +695,7 @@ Sometimes build a Minio Request can be complex because of multiple options. We introduce the possibility to use a POJO as the body. In Minio, there are multiple operations you can submit, as an example for List brokers request, you can do something like: +._Java-only: uses Minio Java SDK builder API for POJO request body_ [source,java] ---- from("direct:minio") diff --git a/components/camel-netty-http/src/main/docs/netty-http-component.adoc b/components/camel-netty-http/src/main/docs/netty-http-component.adoc index aebe0102be50..8dc08df9f8d9 100644 --- a/components/camel-netty-http/src/main/docs/netty-http-component.adoc +++ b/components/camel-netty-http/src/main/docs/netty-http-component.adoc @@ -519,6 +519,7 @@ This will cause Camel to fail on startup. *Two routes are sharing the same port, but the second route is misconfigured and will fail on starting* +._Java-only: demonstrates a misconfiguration that causes startup failure_ [source,java] ---- from("netty-http:http://0.0.0.0:{{port}}/foo") diff --git a/components/camel-reactive-streams/src/main/docs/reactive-streams-component.adoc b/components/camel-reactive-streams/src/main/docs/reactive-streams-component.adoc index 6d2df02a0026..a8976ae9f56e 100644 --- a/components/camel-reactive-streams/src/main/docs/reactive-streams-component.adoc +++ b/components/camel-reactive-streams/src/main/docs/reactive-streams-component.adoc @@ -258,12 +258,40 @@ Flowable.just(new File("file1.txt"), new File("file2.txt")) In order this to work, a route like the following should be defined in the Camel context: +[tabs] +==== +Java:: ++ [source,java] ---- from("reactive-streams:readAndMarshal") .marshal() // ... other details ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="reactive-streams:readAndMarshal"/> + <marshal> + <!-- ... other details --> + </marshal> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: reactive-streams:readAndMarshal + steps: + - marshal: {} +---- +==== + ==== Request a transformation to Camel using the direct API An alternative approach consists of using the URI endpoints directly in the reactive flow: @@ -286,12 +314,40 @@ route using `reactive-streams:` endpoints (although they are used under the hood In this case, the Camel transformation can be just: +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:process") .marshal() // ... other details ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:process"/> + <marshal> + <!-- ... other details --> + </marshal> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:process + steps: + - marshal: {} +---- +==== + === Process Camel data into the reactive framework diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc b/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc index 1fc8fceaf0f0..2cabfa6d5f01 100644 --- a/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc +++ b/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc @@ -124,6 +124,7 @@ As a general example on using the operations in this salesforce component, the f the upsertSObject API, with the sObjectIdName parameter specifying 'Name' as the external id field. The request message body should be an SObject DTO generated using the maven plugin. +._Java-only: endpoint URI snippet_ [source,java] ---- ...to("salesforce:upsertSObject?sObjectIdName=Name")... @@ -1891,6 +1892,7 @@ type, which can be XML, CSV, ZIP_XML or ZIP_CSV. The put message body will contain `BatchInfo` on success, or throw a `SalesforceException` on error. +._Java-only: endpoint URI snippet_ [source,java] ---- ...to("salesforce:createBatch").. diff --git a/components/camel-seda/src/main/docs/seda-component.adoc b/components/camel-seda/src/main/docs/seda-component.adoc index d97747dfb8ae..a1291c2ac8c1 100644 --- a/components/camel-seda/src/main/docs/seda-component.adoc +++ b/components/camel-seda/src/main/docs/seda-component.adoc @@ -196,6 +196,7 @@ number of concurrent consumers is always fixed. Be aware that adding a thread pool to a SEDA endpoint by doing something like: +._Java-only: thread pool added to SEDA endpoint_ [source,java] ---- from("seda:stageName").thread(5).process(...) @@ -207,6 +208,7 @@ Instead, you might wish to configure a xref:direct-component.adoc[Direct] endpoi with a thread pool, which can process messages both synchronously and asynchronously. For example: +._Java-only: thread pool on a Direct endpoint_ [source,java] ---- from("direct:stageName").thread(5).process(...) diff --git a/components/camel-spring-parent/camel-spring-ai/camel-spring-ai-chat/src/main/docs/spring-ai-chat-component.adoc b/components/camel-spring-parent/camel-spring-ai/camel-spring-ai-chat/src/main/docs/spring-ai-chat-component.adoc index 98f99780c8c5..1ca23733b5f2 100644 --- a/components/camel-spring-parent/camel-spring-ai/camel-spring-ai-chat/src/main/docs/spring-ai-chat-component.adoc +++ b/components/camel-spring-parent/camel-spring-ai/camel-spring-ai-chat/src/main/docs/spring-ai-chat-component.adoc @@ -234,16 +234,48 @@ String response = template.requestBodyAndHeader( ==== Via Endpoint Configuration +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:chat") .to("spring-ai-chat:test?chatModel=#chatModel&temperature=0.8&maxTokens=500"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="spring-ai-chat:test?chatModel=#chatModel&temperature=0.8&maxTokens=500"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: spring-ai-chat:test + parameters: + chatModel: "#chatModel" + temperature: 0.8 + maxTokens: 500 +---- +==== + === Adding System Messages System messages provide instructions or context to the LLM. You can configure them via endpoint parameters for default behavior: +._Java-only: route definition with ProducerTemplate usage_ [source,java] ---- from("direct:chat") @@ -258,6 +290,7 @@ String response = template.requestBody("direct:chat", The component automatically tracks token usage and response metadata, providing them via headers. You can access these headers in your Camel routes: +._Java-only: route with `.log()` header interpolation and ProducerTemplate usage_ [source,java] ---- from("direct:chat") @@ -297,6 +330,10 @@ The component supports attaching metadata to both user and system messages. This You can attach metadata to user messages via headers or endpoint configuration: +[tabs] +==== +Java:: ++ [source,java] ---- // Using URL parameters - nested property syntax @@ -307,10 +344,42 @@ from("direct:chat") + "&userMetadata.priority=high"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="spring-ai-chat:test?chatModel=#chatModel&userMetadata.messageId=msg-123&userMetadata.userId=user-456&userMetadata.priority=high"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: spring-ai-chat:test + parameters: + chatModel: "#chatModel" + userMetadata.messageId: msg-123 + userMetadata.userId: user-456 + userMetadata.priority: high +---- +==== + ==== System Message Metadata Similarly, you can attach metadata to system messages: +[tabs] +==== +Java:: ++ [source,java] ---- // Using URL parameters - nested property syntax @@ -321,6 +390,34 @@ from("direct:chat") + "&systemMetadata.promptVersion=2024-01"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="spring-ai-chat:test?chatModel=#chatModel&systemMetadata.version=1.0&systemMetadata.model=gpt-4&systemMetadata.promptVersion=2024-01"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: spring-ai-chat:test + parameters: + chatModel: "#chatModel" + systemMetadata.version: "1.0" + systemMetadata.model: gpt-4 + systemMetadata.promptVersion: "2024-01" +---- +==== + === Conversation Memory The component provides automatic conversation memory management via Spring AI's ChatClient and ChatMemory. Two memory strategies are supported: @@ -409,6 +506,10 @@ The component integrates with the xref:spring-ai-tools-component.adoc[Spring AI When you configure the `tags` parameter, the chat component discovers all matching tools from `spring-ai-tools` routes, registers them with Spring AI's ChatClient, and allows the LLM to call them during conversation. +[tabs] +==== +Java:: ++ [source,java] ---- // Define tools @@ -432,6 +533,111 @@ from("direct:multiToolChat") .to("spring-ai-chat:chat?tags=weather,math,finance&chatClient=#chatClient"); ---- +XML:: ++ +[source,xml] +---- +<!-- Define tools --> +<route> + <from uri="spring-ai-tools:weather?tags=weather&description=Get current weather for a location"/> + <setBody><constant>Sunny</constant></setBody> +</route> + +<route> + <from uri="spring-ai-tools:calculator?tags=math&description=Evaluate mathematical expressions"/> + <setBody><constant>42</constant></setBody> +</route> + +<route> + <from uri="spring-ai-tools:stock?tags=finance&description=Get current stock price"/> + <setBody><constant>42</constant></setBody> +</route> + +<!-- Chat endpoints with different tool combinations --> +<route> + <from uri="direct:weatherChat"/> + <to uri="spring-ai-chat:chat?tags=weather&chatClient=#chatClient"/> +</route> + +<route> + <from uri="direct:mathChat"/> + <to uri="spring-ai-chat:chat?tags=math&chatClient=#chatClient"/> +</route> + +<route> + <from uri="direct:multiToolChat"/> + <to uri="spring-ai-chat:chat?tags=weather,math,finance&chatClient=#chatClient"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +# Define tools +- route: + from: + uri: spring-ai-tools:weather + parameters: + tags: weather + description: Get current weather for a location + steps: + - setBody: + constant: Sunny + +- route: + from: + uri: spring-ai-tools:calculator + parameters: + tags: math + description: Evaluate mathematical expressions + steps: + - setBody: + constant: "42" + +- route: + from: + uri: spring-ai-tools:stock + parameters: + tags: finance + description: Get current stock price + steps: + - setBody: + constant: "42" + +# Chat endpoints with different tool combinations +- route: + from: + uri: direct:weatherChat + steps: + - to: + uri: spring-ai-chat:chat + parameters: + tags: weather + chatClient: "#chatClient" + +- route: + from: + uri: direct:mathChat + steps: + - to: + uri: spring-ai-chat:chat + parameters: + tags: math + chatClient: "#chatClient" + +- route: + from: + uri: direct:multiToolChat + steps: + - to: + uri: spring-ai-chat:chat + parameters: + tags: weather,math,finance + chatClient: "#chatClient" +---- +==== + **How it works:** 1. LLM analyzes the question and decides which tools to call @@ -521,6 +727,10 @@ template.requestBody("direct:scan-analyzer", message, String.class); To prevent out-of-memory errors with large media files, the component validates file sizes before loading them into memory. The default maximum file size is 1MB, configurable via: +[tabs] +==== +Java:: ++ [source,java] ---- // Configure via endpoint parameter (in bytes) @@ -537,6 +747,73 @@ from("file:trusted") .to("spring-ai-chat:vision?chatModel=#chatModel&maxFileSize=0"); ---- +XML:: ++ +[source,xml] +---- +<!-- Configure via endpoint parameter (in bytes) - 5MB --> +<route> + <from uri="file:uploads"/> + <to uri="spring-ai-chat:vision?chatModel=#chatModel&maxFileSize=5242880"/> +</route> + +<!-- Override via header for dynamic control - 10MB --> +<route> + <from uri="direct:upload"/> + <setHeader name="CamelSpringAiChatMaxFileSize"> + <constant>10485760</constant> + </setHeader> + <to uri="spring-ai-chat:vision?chatModel=#chatModel"/> +</route> + +<!-- Disable size checking (not recommended) --> +<route> + <from uri="file:trusted"/> + <to uri="spring-ai-chat:vision?chatModel=#chatModel&maxFileSize=0"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +# Configure via endpoint parameter (in bytes) - 5MB +- route: + from: + uri: file:uploads + steps: + - to: + uri: spring-ai-chat:vision + parameters: + chatModel: "#chatModel" + maxFileSize: 5242880 + +# Override via header for dynamic control - 10MB +- route: + from: + uri: direct:upload + steps: + - setHeader: + name: CamelSpringAiChatMaxFileSize + constant: "10485760" + - to: + uri: spring-ai-chat:vision + parameters: + chatModel: "#chatModel" + +# Disable size checking (not recommended) +- route: + from: + uri: file:trusted + steps: + - to: + uri: spring-ai-chat:vision + parameters: + chatModel: "#chatModel" + maxFileSize: 0 +---- +==== + Files exceeding the configured limit will be rejected with an `IllegalArgumentException`. === SafeGuard - Content Filtering @@ -549,6 +826,10 @@ This feature is useful for: * Compliance with data protection requirements * Filtering inappropriate or restricted topics +[tabs] +==== +Java:: ++ [source,java] ---- // Configure safeguard with sensitive words @@ -558,6 +839,33 @@ from("direct:safeguard") + "&safeguardFailureResponse=I cannot provide information containing sensitive words"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:safeguard"/> + <to uri="spring-ai-chat:test?chatModel=#chatModel&safeguardSensitiveWords=password,secret,confidential,api-key&safeguardFailureResponse=I cannot provide information containing sensitive words"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:safeguard + steps: + - to: + uri: spring-ai-chat:test + parameters: + chatModel: "#chatModel" + safeguardSensitiveWords: "password,secret,confidential,api-key" + safeguardFailureResponse: "I cannot provide information containing sensitive words" +---- +==== + **Configuration Options:** * `safeguardSensitiveWords`: Comma-separated list of words to block in responses @@ -675,6 +983,7 @@ from("direct:chat") Select specific tools by name using the `toolNames` parameter, instead of (or in addition to) tag-based discovery. This is useful for selecting individual `@Tool` methods or controlling which tools are available per endpoint: +._Java-only: route definition with dynamic tool selection via ProducerTemplate header_ [source,java] ---- // Select only the getCapital tool by name @@ -728,6 +1037,10 @@ Enable automatic validation of structured output with retry on failure. When the LLM produces invalid output (doesn't match the expected JSON Schema), the advisor re-prompts the LLM with validation errors: +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:chat") @@ -738,8 +1051,41 @@ from("direct:chat") + "&structuredOutputValidationMaxAttempts=3"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="spring-ai-chat:chat?chatModel=#chatModel&outputFormat=BEAN&outputClass=com.example.ActorFilms&structuredOutputValidation=true&structuredOutputValidationMaxAttempts=3"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: spring-ai-chat:chat + parameters: + chatModel: "#chatModel" + outputFormat: BEAN + outputClass: com.example.ActorFilms + structuredOutputValidation: true + structuredOutputValidationMaxAttempts: 3 +---- +==== + If all retry attempts fail, the exception propagates to Camel's error handler: +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:chat") @@ -753,6 +1099,52 @@ from("direct:chat") .end(); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <doTry> + <to uri="spring-ai-chat:chat?chatModel=#chatModel&outputFormat=BEAN&outputClass=com.example.ActorFilms&structuredOutputValidation=true&structuredOutputValidationMaxAttempts=2"/> + <doCatch> + <exception>java.lang.Exception</exception> + <log message="Structured output validation failed: ${exception.message}"/> + <to uri="direct:fallback"/> + </doCatch> + </doTry> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - doTry: + steps: + - to: + uri: spring-ai-chat:chat + parameters: + chatModel: "#chatModel" + outputFormat: BEAN + outputClass: com.example.ActorFilms + structuredOutputValidation: true + structuredOutputValidationMaxAttempts: 2 + doCatch: + - exception: + - java.lang.Exception + steps: + - log: + message: "Structured output validation failed: ${exception.message}" + - to: + uri: direct:fallback +---- +==== + The advisor requires `outputClass` or `entityClass` to be set so it can generate a JSON Schema for validation. A warning is logged if neither is configured. @@ -766,6 +1158,10 @@ Configure MCP servers using the `mcpServer.<name>.<property>` prefix notation: ==== Stdio Transport +[tabs] +==== +Java:: ++ [source,java] ---- // Connect to MCP filesystem server via stdio @@ -776,8 +1172,40 @@ from("direct:chat") + "&mcpServer.fs.args=-y,@modelcontextprotocol/server-filesystem,/tmp"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="spring-ai-chat:chat?chatModel=#chatModel&mcpServer.fs.transportType=stdio&mcpServer.fs.command=npx&mcpServer.fs.args=-y,@modelcontextprotocol/server-filesystem,/tmp"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: spring-ai-chat:chat + parameters: + chatModel: "#chatModel" + mcpServer.fs.transportType: stdio + mcpServer.fs.command: npx + mcpServer.fs.args: "-y,@modelcontextprotocol/server-filesystem,/tmp" +---- +==== + ==== SSE Transport +[tabs] +==== +Java:: ++ [source,java] ---- // Connect to MCP server via SSE @@ -787,8 +1215,39 @@ from("direct:chat") + "&mcpServer.weather.url=http://mcp-server:3001/sse"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="spring-ai-chat:chat?chatModel=#chatModel&mcpServer.weather.transportType=sse&mcpServer.weather.url=http://mcp-server:3001/sse"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: spring-ai-chat:chat + parameters: + chatModel: "#chatModel" + mcpServer.weather.transportType: sse + mcpServer.weather.url: "http://mcp-server:3001/sse" +---- +==== + ==== Multiple MCP Servers +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:chat") @@ -800,11 +1259,45 @@ from("direct:chat") + "&mcpServer.weather.url=http://weather-mcp:3001/sse"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="spring-ai-chat:chat?chatModel=#chatModel&mcpServer.fs.transportType=stdio&mcpServer.fs.command=npx&mcpServer.fs.args=-y,@modelcontextprotocol/server-filesystem,/tmp&mcpServer.weather.transportType=sse&mcpServer.weather.url=http://weather-mcp:3001/sse"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: spring-ai-chat:chat + parameters: + chatModel: "#chatModel" + mcpServer.fs.transportType: stdio + mcpServer.fs.command: npx + mcpServer.fs.args: "-y,@modelcontextprotocol/server-filesystem,/tmp" + mcpServer.weather.transportType: sse + mcpServer.weather.url: "http://weather-mcp:3001/sse" +---- +==== + ==== OAuth Authentication for MCP Servers For MCP servers requiring authentication, configure an OAuth profile per server. This requires `camel-oauth` on the classpath: +[tabs] +==== +Java:: ++ [source,java] ---- from("direct:chat") @@ -814,6 +1307,34 @@ from("direct:chat") + "&mcpServer.api.oauthProfile=keycloak"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="direct:chat"/> + <to uri="spring-ai-chat:chat?chatModel=#chatModel&mcpServer.api.transportType=sse&mcpServer.api.url=http://secure-mcp:3001/sse&mcpServer.api.oauthProfile=keycloak"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: direct:chat + steps: + - to: + uri: spring-ai-chat:chat + parameters: + chatModel: "#chatModel" + mcpServer.api.transportType: sse + mcpServer.api.url: "http://secure-mcp:3001/sse" + mcpServer.api.oauthProfile: keycloak +---- +==== + With corresponding properties: [source,properties] diff --git a/components/camel-spring-parent/camel-spring-rabbitmq/src/main/docs/spring-rabbitmq-component.adoc b/components/camel-spring-parent/camel-spring-rabbitmq/src/main/docs/spring-rabbitmq-component.adoc index b7f9345ee842..dd44485922ca 100644 --- a/components/camel-spring-parent/camel-spring-rabbitmq/src/main/docs/spring-rabbitmq-component.adoc +++ b/components/camel-spring-parent/camel-spring-rabbitmq/src/main/docs/spring-rabbitmq-component.adoc @@ -81,11 +81,33 @@ The `ConnectionFactory` is auto-detected by default, so you can do: To use default exchange name (which would be an empty exchange name in RabbitMQ) then you should use `default` as name in the endpoint uri, such as: +[tabs] +==== +Java:: ++ [source,java] ---- to("spring-rabbitmq:default?routingKey=foo") ---- +XML:: ++ +[source,xml] +---- +<to uri="spring-rabbitmq:default?routingKey=foo"/> +---- + +YAML:: ++ +[source,yaml] +---- +- to: + uri: spring-rabbitmq:default + parameters: + routingKey: foo +---- +==== + === Auto declare exchanges, queues and bindings Before you can send or receive messages from RabbitMQ, then exchanges, queues and bindings must be setup first. @@ -153,6 +175,7 @@ So if we send `World` as message body to _direct:start_ then, we will se the mes - `log:input -> World` - `log:response -> Hello World` +._Java-only: Java DSL with ExchangePattern.InOut and body().prepend()_ [source,java] ---- from("direct:start") diff --git a/components/camel-spring-parent/camel-spring-ws/src/main/docs/spring-ws-component.adoc b/components/camel-spring-parent/camel-spring-ws/src/main/docs/spring-ws-component.adoc index 46e0a77ed7a9..04e89c3268b3 100644 --- a/components/camel-spring-parent/camel-spring-ws/src/main/docs/spring-ws-component.adoc +++ b/components/camel-spring-parent/camel-spring-ws/src/main/docs/spring-ws-component.adoc @@ -281,6 +281,7 @@ all Spring-WS endpoints - the local messageFilter directly on the endpoint as follows: +._Java-only: endpoint URI fragment with bean reference_ [source,java] ---- to("spring-ws:http://yourdomain.com?messageFilter=#myEndpointSpecificMessageFilter"); @@ -428,40 +429,169 @@ define what web service requests are handled by your endpoint: The following route will receive all web service requests that have a root element named "GetFoo" within the `\http://example.com/` namespace. +[tabs] +==== +Java:: ++ [source,java] ---- from("spring-ws:rootqname:{http://example.com/}GetFoo?endpointMapping=#endpointMapping") .convertBodyTo(String.class).to("mock:example"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="spring-ws:rootqname:{http://example.com/}GetFoo?endpointMapping=#endpointMapping"/> + <convertBodyTo type="String"/> + <to uri="mock:example"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: "spring-ws:rootqname:{http://example.com/}GetFoo" + parameters: + endpointMapping: "#endpointMapping" + steps: + - convertBodyTo: + type: String + - to: + uri: mock:example +---- +==== + The following route will receive web service requests containing the `\http://example.com/GetFoo` SOAP action. +[tabs] +==== +Java:: ++ [source,java] ---- from("spring-ws:soapaction:http://example.com/GetFoo?endpointMapping=#endpointMapping") .convertBodyTo(String.class).to("mock:example"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="spring-ws:soapaction:http://example.com/GetFoo?endpointMapping=#endpointMapping"/> + <convertBodyTo type="String"/> + <to uri="mock:example"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: "spring-ws:soapaction:http://example.com/GetFoo" + parameters: + endpointMapping: "#endpointMapping" + steps: + - convertBodyTo: + type: String + - to: + uri: mock:example +---- +==== + The following route will receive all requests sent to `\http://example.com/foobar`. +[tabs] +==== +Java:: ++ [source,java] ---- from("spring-ws:uri:http://example.com/foobar?endpointMapping=#endpointMapping") .convertBodyTo(String.class).to("mock:example"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="spring-ws:uri:http://example.com/foobar?endpointMapping=#endpointMapping"/> + <convertBodyTo type="String"/> + <to uri="mock:example"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: "spring-ws:uri:http://example.com/foobar" + parameters: + endpointMapping: "#endpointMapping" + steps: + - convertBodyTo: + type: String + - to: + uri: mock:example +---- +==== + The route below will receive requests that contain the element `<foobar>abc</foobar>` anywhere inside the message (and the default namespace). +[tabs] +==== +Java:: ++ [source,java] ---- from("spring-ws:xpathresult:abc?expression=//foobar&endpointMapping=#endpointMapping") .convertBodyTo(String.class).to("mock:example"); ---- +XML:: ++ +[source,xml] +---- +<route> + <from uri="spring-ws:xpathresult:abc?expression=//foobar&endpointMapping=#endpointMapping"/> + <convertBodyTo type="String"/> + <to uri="mock:example"/> +</route> +---- + +YAML:: ++ +[source,yaml] +---- +- route: + from: + uri: "spring-ws:xpathresult:abc" + parameters: + expression: "//foobar" + endpointMapping: "#endpointMapping" + steps: + - convertBodyTo: + type: String + - to: + uri: mock:example +---- +==== + === Alternative configuration, using existing endpoint mappings For every endpoint with mapping-type `beanname` one bean of type diff --git a/components/camel-sql/src/main/docs/sql-component.adoc b/components/camel-sql/src/main/docs/sql-component.adoc index 52be8b127012..ab3d79913339 100644 --- a/components/camel-sql/src/main/docs/sql-component.adoc +++ b/components/camel-sql/src/main/docs/sql-component.adoc @@ -482,6 +482,7 @@ YAML:: And the bean has the following method: +._Java-only: bean class used as expression parameter_ [source,java] ---- public static class MyIdGenerator {
