You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by "allthingssecurity (via GitHub)" <gi...@apache.org> on 2026/09/23 13:23:14 UTC

[PR] CAMEL-24952: camel-seda - virtualThreadPerTask consumer stop waits for dispatched tasks that have not started [camel]

allthingssecurity opened a new pull request, #26798:
URL: https://github.com/apache/camel/pull/26798

   # Description
   
   [CAMEL-24952](https://issues.apache.org/jira/browse/CAMEL-24952)
   
   `ThreadPerTaskSedaConsumer` (`virtualThreadPerTask`) incremented `activeTasks` only when a task started running. An exchange that was polled but whose task hadn't started yet was not in the queue, not inflight and not counted. A graceful stop therefore considered the consumer idle, and the task later ran against the stopped route and was rejected (only logged), so the message was lost.
   
   This change: `activeTasks` is incremented before `taskExecutor.execute(...)`. It's decremented, and the concurrency permit released, in the task's `finally` block, and also when `execute` throws. Before, the permit leaked in that case.
   
   Tests: new `ThreadPerTaskSedaConsumerStopTest`. A `ThreadPoolFactory` holds dispatched tasks until the stop reaches `awaitTermination`, so the test is deterministic. Without the fix, 0 messages are delivered instead of 1 (the exchange is rejected). Suites: 166 tests, 0 failures (2 pre-existing skips).
   
   Not changed here: a failed exchange in this consumer is reported to the exception handler twice. That's noted in the JIRA ticket for a separate change.
   
   Found with a TLA+ model of the thread-per-task consumer stop, then reproduced against the real classes.
   
   # Target
   
   - [x] I checked that the commit is targeting the correct branch (Camel 4 uses the `main` branch)
   
   # Tracking
   - [x] If this is a large change, bug fix, or code improvement, I checked there is a [JIRA issue](https://issues.apache.org/jira/browse/CAMEL) filed for the change (usually before you start working on it).
   
   # Apache Camel coding standards and style
   
   - [x] I checked that each commit in the pull request has a meaningful subject line and body.
   - [ ] I have run `mvn clean install -DskipTests` locally from root folder and I have committed all auto-generated changes.
     (I built and tested the affected modules, including the formatter and import-sort plugins. I did not run the full root build.)
   
   # AI-assisted contributions
   
   - [x] If this PR includes AI-generated code, commits have proper co-authorship attribution (e.g., `Co-authored-by` trailers) and the PR description identifies the AI tool used.
     This PR was prepared with Claude Code (Claude Opus 5.5). The commit carries a `Co-Authored-By` trailer.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24952: camel-seda - virtualThreadPerTask consumer stop waits for dispatched tasks that have not started [camel]

Posted by "github-actions[bot] (via GitHub)" <gi...@apache.org>.
github-actions[bot] commented on PR #26798:
URL: https://github.com/apache/camel/pull/26798#issuecomment-5813059508

   <!-- ci-tested-modules -->
   :test_tube: **CI tested the following changed modules:**
   
   - `components/camel-seda`
   - `core/camel-core`
   
   > :information_source: Dependent modules were not tested because the total number of affected modules exceeded the threshold (50). Use the `test-dependents` label to force testing all dependents.
   
   ---
   
   <details><summary>:microscope: Scalpel shadow comparison — Scalpel: 479 of 693 tested, 28 compile-only — current: 483 all tested</summary>
   
   [Maveniverse Scalpel](https://github.com/maveniverse/scalpel) detected **479 affected modules** (current approach: 483).
   
   **Skip-tests mode would test 479 modules** (2 direct + 477 downstream), **skip tests for 28** (generated code, meta-modules)
   
   <details><summary>Modules only in current approach (4)</summary>
   
   - `camel-debug`
   - `camel-google-common`
   - `camel-jbang-console`
   - `camel-test-infra-core`
   
   </details>
   
   
   <details><summary>Modules Scalpel would test (479)</summary>
   
   - `archetypes` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-a2a` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-activemq` ← downstream of org.apache.camel:camel-test-infra-artemis
   - `camel-activemq6` ← downstream of org.apache.camel:camel-test-infra-artemis
   - `camel-ai-observability` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ai-observability-api` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ai-resource` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ai-tool` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-alibaba-eventbridge` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-alibaba-fc` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-alibaba-kms` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-alibaba-mns` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-alibaba-oss` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-alibaba-ots` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-alibaba-sls` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-alibaba-sms` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-amqp` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-api-component-maven-plugin` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-arangodb` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-archetype-api-component` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-archetype-component` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-archetype-dataformat` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-archetype-java` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-archetype-main` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-as2` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-as2-api` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-asn1` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-asterisk` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-atmosphere-websocket` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-atom` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-attachments` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-avro` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-avro-rpc` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-aws-bedrock` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws-cloudtrail` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws-config` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-aws-parameter-store` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws-secrets-manager` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws-security-hub` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-athena` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-comprehend` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-cw` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-ddb` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-ec2` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-ecs` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-eks` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-eventbridge` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-iam` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-kinesis` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-kms` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-lambda` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-mq` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-msk` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-polly` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-redshift` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-rekognition` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-s3` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-s3-vectors` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-ses` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-sns` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-sqs` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-step-functions` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-sts` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-textract` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-timestream` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-aws2-transcribe` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-aws2-translate` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-azure-cosmosdb` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-azure-eventgrid` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-azure-eventhubs` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-azure-files` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-azure-functions` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-azure-key-vault` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-azure-schema-registry` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-azure-servicebus` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-azure-storage-blob` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-azure-storage-datalake` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-azure-storage-queue` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-barcode` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-base64` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-bean-validator` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-beanio` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-bindy` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-bonita` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-box` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-braintree` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-caffeine` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-camunda` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cassandraql` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cbor` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-chatscript` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-chunk` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cli-connector` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cli-debug` ← downstream of org.apache.camel:camel-cli-connector
   - `camel-clickhouse` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-clickup` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cloudevents` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cm-sms` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-coap` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cometd` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-console` ← downstream of org.apache.camel:camel-core
   - `camel-consul` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-core` ← core/camel-core/src/test/java/org/apache/camel/component/seda/ThreadPerTaskSedaConsumerStopTest.java
   - `camel-core-all` ← downstream of org.apache.camel:camel-main
   - `camel-couchbase` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-couchdb` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cron` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-crypto` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-crypto-pgp` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-csv` ← downstream of org.apache.camel:camel-main
   - `camel-cxf-common` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cxf-rest` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cxf-soap` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cxf-spring-common` ← downstream of org.apache.camel:camel-spring-xml
   - `camel-cxf-spring-rest` ← downstream of org.apache.camel:camel-spring-xml
   - `camel-cxf-spring-soap` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-cxf-spring-transport` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cxf-transport` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-cyberark-vault` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-dapr` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-datasonnet` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-debezium-common` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-debezium-db2` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-debezium-maven-plugin` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-debezium-mongodb` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-debezium-mysql` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-debezium-oracle` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-debezium-postgres` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-debezium-sqlserver` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-dfdl` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-dhis2` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-dhis2-api` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-dhis2-parent` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-diagram` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-disruptor` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-djl` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-dns` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-docker` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-docling` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-drill` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-dropbox` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-dsl-modeline` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-duckdb` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-dynamic-router` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-ehcache` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-elasticsearch` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-elasticsearch-rest-client` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-event` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-exec` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-fastjson` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-fhir` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-file-watch` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-flatpack` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-flink` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-flowable` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-fop` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-fory` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-freemarker` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-ftp` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-geocoder` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-git` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-github2` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-bigquery` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-calendar` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-drive` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-firestore` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-functions` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-mail` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-pubsub` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-secret-manager` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-sheets` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-speech-to-text` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-storage` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-text-to-speech` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-vertexai` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-google-vision` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-graphql` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-grok` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-groovy` ← downstream of org.apache.camel:camel-main
   - `camel-grpc` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-gson` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-hashicorp-vault` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-hazelcast` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-hivemq` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-hl7` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-http` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-http-base` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-http-common` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-huaweicloud-dms` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-huaweicloud-frs` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-huaweicloud-functiongraph` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-huaweicloud-iam` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-huaweicloud-imagerecognition` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-huaweicloud-obs` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-huaweicloud-smn` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-huggingface` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ibm-cos` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ibm-secrets-manager` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ibm-watson-discovery` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ibm-watson-language` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ibm-watson-speech-to-text` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ibm-watson-text-to-speech` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ibm-watsonx-ai` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ibm-watsonx-data` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ical` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-iggy` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ignite` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-infinispan` ← downstream of org.apache.camel:camel-stub
   - `camel-infinispan-common` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-infinispan-embedded` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-influxdb` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-influxdb2` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-iso8583` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-jackson` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-jackson-avro` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jackson-protobuf` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jackson3` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-jackson3-avro` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jackson3-protobuf` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jackson3xml` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-jacksonxml` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-jactl` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jandex` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jasypt` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-java-joor-dsl` ← downstream of org.apache.camel:camel-seda
   - `camel-javascript` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jaxb` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jbang-mcp` ← downstream of org.apache.camel:camel-java-joor-dsl
   - `camel-jbang-plugin-mcp` ← downstream of org.apache.camel:camel-jbang-core
   - `camel-jbang-plugin-route-parser` ← downstream of org.apache.camel:camel-route-parser
   - `camel-jbang-plugin-tui` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jbang-plugin-validate` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jcache` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jcr` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jdbc` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-jetty` ← downstream of org.apache.camel:camel-main
   - `camel-jetty-common` ← downstream of org.apache.camel:camel-spring-xml
   - `camel-jfr` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jgroups` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jgroups-raft` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jira` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jms` ← downstream of org.apache.camel:camel-spring-xml
   - `camel-jmx` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jolt` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jooq` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-joor` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jpa` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jq` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jsch` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jslt` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-json-validator` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jsonapi` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jsonata` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jsonb` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-jsonpath` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-jsoup` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jt400` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-jta` ← downstream of org.apache.camel:camel-sql
   - `camel-jte` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-kafka` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-kamelet` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-kamelet-main-support` ← downstream of org.apache.camel:camel-main
   - `camel-keycloak` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-knative` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-knative-api` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-knative-http` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-kserve` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-kubernetes` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-kudu` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-langchain4j-agent` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-langchain4j-chat` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-langchain4j-core` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-langchain4j-embeddings` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-langchain4j-embeddingstore` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-langchain4j-ingest` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-langchain4j-tokenizer` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-langchain4j-web-search` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-launcher-container` ← downstream of org.apache.camel:camel-launcher
   - `camel-ldap` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ldif` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-lra` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-lucene` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-lumberjack` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-lzf` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-mail` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-mail-microsoft-oauth` ← downstream of org.apache.camel:camel-mail
   - `camel-main` ← downstream of org.apache.camel:camel-seda
   - `camel-management` ← downstream of org.apache.camel:camel-core
   - `camel-mapstruct` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-master` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-maven-plugin` ← downstream of org.apache.camel:camel-spring-main
   - `camel-mcp-server` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-mcp-server-api` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-mdc` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-metrics` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-micrometer` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-micrometer-observability` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-micrometer-prometheus` ← downstream of org.apache.camel:camel-platform-http-main
   - `camel-microprofile-config` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-microprofile-fault-tolerance` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-microprofile-health` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-milo` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-milvus` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-mina` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-mina-sftp` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-minio` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-mllp` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-mongodb` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-mongodb-gridfs` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-mustache` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-mvel` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-mybatis` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-nats` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-neo4j` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-netty` ← downstream of org.apache.camel:camel-main
   - `camel-netty-http` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-oaipmh` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-oauth` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-observability-services` ← downstream of org.apache.camel:camel-opentelemetry2
   - `camel-observation` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-ocsf` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ognl` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-olingo2` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-olingo2-api` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-olingo4` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-olingo4-api` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-once` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-opa` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-openai` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-openapi-java` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-openapi-validator` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-opensearch` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-openstack` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-opentelemetry` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-opentelemetry-metrics` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-opentelemetry2` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-optaplanner` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-paho` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-paho-mqtt5` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-parquet-avro` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-pdf` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-pg-replication-slot` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-pgevent` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-pgvector` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-pinecone` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-platform-http` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-platform-http-jolokia` ← downstream of org.apache.camel:camel-platform-http
   - `camel-platform-http-main` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-platform-http-vertx` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-plc4x` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-pqc` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-printer` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-protobuf` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-pubnub` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-pulsar` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-python` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-python3` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-qdrant` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-quartz` ← downstream of org.apache.camel:camel-cron
   - `camel-quickfix` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-quickjs` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-reactive-streams` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-reactor` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-redis` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-resilience4j` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-resilience4j-micrometer` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-resourceresolver-github` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-rest-openapi` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-rest-postman` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-restdsl-openapi-plugin` ← downstream of org.apache.camel:camel-servlet
   - `camel-robotframework` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-rocketmq` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-rss` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-rxjava` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-salesforce` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-salesforce-codegen` ← downstream of org.apache.camel:camel-salesforce
   - `camel-sap-netweaver` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-saxon` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-schematron` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-seda` ← components/camel-seda/src/main/java/org/apache/camel/component/seda/ThreadPerTaskSedaConsumer.java
   - `camel-servicenow` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-servicenow-maven-plugin` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-servlet` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-shell` ← downstream of org.apache.camel:camel-test-junit5
   - `camel-shiro` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-sjms` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-sjms2` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-slack` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-smb` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-smooks` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-smpp` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-snakeyaml` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-snmp` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-soap` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-solr` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-spiffe` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-splunk-hec` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-spring` ← downstream of org.apache.camel:camel-cron
   - `camel-spring-ai-chat` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-spring-ai-embeddings` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-spring-ai-image` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-spring-ai-vector-store` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-spring-batch` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-spring-cloud-config` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-spring-jdbc` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-spring-ldap` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-spring-main` ← downstream of org.apache.camel:camel-main
   - `camel-spring-rabbitmq` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-spring-redis` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-spring-security` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-spring-ws` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-spring-xml` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-sql` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-ssh` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-state-store` ← downstream of org.apache.camel:camel-test-main-junit5
   - `camel-stax` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-stitch` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-stream` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-streamcaching-test` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-stringtemplate` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-stripe` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-stub` ← downstream of org.apache.camel:camel-seda
   - `camel-swift` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-syslog` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-tahu` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-tarfile` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-telegram` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-telemetry` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-telemetry-dev` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-tensorflow-serving` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-test-infra-all` ← downstream of org.apache.camel:camel-test-infra-artemis
   - `camel-test-infra-artemis` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-test-infra-smb` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-test-junit5` ← downstream of org.apache.camel:camel-seda
   - `camel-test-junit6` ← downstream of org.apache.camel:camel-seda
   - `camel-test-main-junit5` ← downstream of org.apache.camel:camel-main
   - `camel-test-main-junit6` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-test-spring-junit5` ← downstream of org.apache.camel:camel-test-junit5
   - `camel-test-spring-junit6` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-thrift` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-thymeleaf` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-tika` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-toon` ← downstream of org.apache.camel:camel-test-junit5
   - `camel-tracing` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-twilio` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-twitter` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-typesafe-ai` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-ubl` ← downstream of org.apache.camel:camel-test-junit5
   - `camel-undertow` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-undertow-spring-security` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-univocity-parsers` ← downstream of org.apache.camel:camel-spring-xml
   - `camel-velocity` ← downstream of org.apache.camel:camel-test-spring-junit6
   - `camel-vertx` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-vertx-http` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-vertx-websocket` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-wasm` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-weather` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-weaviate` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-web3j` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-webhook` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-whatsapp` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-wordpress` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-workday` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-xchange` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-xj` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-xml-io-dsl` ← downstream of org.apache.camel:camel-seda
   - `camel-xml-jaxb-dsl` ← downstream of org.apache.camel:camel-seda
   - `camel-xml-jaxb-dsl-test-definition` ← downstream of org.apache.camel:camel-seda
   - `camel-xml-jaxb-dsl-test-spring` ← downstream of org.apache.camel:camel-seda
   - `camel-xmlsecurity` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-xmpp` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-xslt-saxon` ← downstream of org.apache.camel:camel-spring-xml
   - `camel-yaml-dsl-validator` ← downstream of org.apache.camel:camel-stub
   - `camel-yaml-dsl-validator-maven-plugin` ← downstream of org.apache.camel:camel-yaml-dsl-validator
   - `camel-zendesk` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-zip-deflater` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-zipfile` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-zookeeper` ← downstream of org.apache.camel:camel-test-junit6
   - `camel-zookeeper-master` ← downstream of org.apache.camel:camel-test-junit6
   
   </details>
   
   <details><summary>Modules with tests skipped (28)</summary>
   
   - `apache-camel`
   - `camel-allcomponents`
   - `camel-catalog`
   - `camel-catalog-console`
   - `camel-catalog-maven`
   - `camel-catalog-suggest`
   - `camel-componentdsl`
   - `camel-endpointdsl`
   - `camel-endpointdsl-support`
   - `camel-itest`
   - `camel-jbang-core`
   - `camel-jbang-it`
   - `camel-jbang-main`
   - `camel-jbang-plugin-edit`
   - `camel-jbang-plugin-generate`
   - `camel-jbang-plugin-kubernetes`
   - `camel-jbang-plugin-test`
   - `camel-kamelet-main`
   - `camel-launcher`
   - `camel-report-maven-plugin`
   - `camel-route-parser`
   - `camel-salesforce-maven-plugin`
   - `camel-yaml-dsl`
   - `camel-yaml-dsl-deserializers`
   - `camel-yaml-dsl-maven-plugin`
   - `coverage`
   - `docs`
   - `dummy-component`
   
   </details>
   
   > :information_source: Shadow mode — Scalpel observes but does not affect test execution. [Learn more](https://github.com/maveniverse/scalpel)
   
   </details>
   
   :warning: **Some tests are disabled on GitHub Actions** (`@DisabledIfSystemProperty(named = "ci.env.name")`) and require manual verification:
   
   - `core/camel-core`: 3 test(s) disabled on GitHub Actions
   
   <details><summary>Build reactor — dependencies compiled but only changed modules were tested (2 modules, 5.9s total)</summary>
   
   **Total reactor time:** 5.9s
   
   | Module | Duration | Status |
   | --- | --- | --- |
   | Camel :: Seda | 5.9s | SUCCESS |
   | Camel :: Core | n/a |  |
   
   **Top 20 slowest modules:**
   - `Camel :: Seda` (5.9s)
   
   </details>
   
   ---
   :gear: [View full build and test results](https://github.com/apache/camel/actions/runs/35866704993)


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24952: camel-seda - virtualThreadPerTask consumer stop waits for dispatched tasks that have not started [camel]

Posted by "allthingssecurity (via GitHub)" <gi...@apache.org>.
allthingssecurity commented on code in PR #26798:
URL: https://github.com/apache/camel/pull/26798#discussion_r4094284686


##########
components/camel-seda/src/main/java/org/apache/camel/component/seda/ThreadPerTaskSedaConsumer.java:
##########
@@ -128,9 +128,24 @@ protected void afterPollEmpty() {
 
     @Override
     protected void processPolledExchange(Exchange exchange) {
+        // count the task when it is dispatched (not when it starts running), so a graceful shutdown
+        // also waits for polled exchanges whose task has not started yet
+        activeTasks.increment();
+        try {
+            dispatch(exchange);
+        } catch (RuntimeException e) {
+            // the task was not dispatched (e.g. rejected)
+            activeTasks.decrement();

Review Comment:
   Good point. The undo is now in a `finally` block (in 435e03640), guarded by a `dispatched` flag. That way it also covers an `Error` thrown while dispatching, not only a `RuntimeException`.
   
   A plain `finally` decrement wouldn't work here. The counter tracks tasks that were dispatched but haven't finished, so on success the task decrements it itself in its own `finally` when it completes. Decrementing again when `dispatch` returns would count the task twice and let a graceful shutdown stop waiting too early. So the `finally` only undoes the count when the task was *not* dispatched. I also rebased onto current `main`. `Seda*` and `*ThreadPerTask*`: 118 tests, 0 failures.
   
   _Claude Code on behalf of allthingssecurity_



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24952: camel-seda - virtualThreadPerTask consumer stop waits for dispatched tasks that have not started [camel]

Posted by "davsclaus (via GitHub)" <gi...@apache.org>.
davsclaus merged PR #26798:
URL: https://github.com/apache/camel/pull/26798


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24952: camel-seda - virtualThreadPerTask consumer stop waits for dispatched tasks that have not started [camel]

Posted by "github-actions[bot] (via GitHub)" <gi...@apache.org>.
github-actions[bot] commented on PR #26798:
URL: https://github.com/apache/camel/pull/26798#issuecomment-5812764485

   :star2: Thank you for your contribution to the Apache Camel project! :star2:
     :robot: CI automation will test this PR automatically.
   
     :camel: Apache Camel Committers, please review the following items:
   
     * First-time contributors **require MANUAL approval** for the GitHub Actions to run
     * You can use the command `/component-test (camel-)component-name1 (camel-)component-name2..` to request a test from the test bot although they are normally detected and executed by CI.
     * You can label PRs using `skip-tests` and `test-dependents` to fine-tune the checks executed by this PR.
     * Build and test logs are available in the summary page. **Only** [Apache Camel committers](https://camel.apache.org/community/team/#committers) have access to the summary.
     
     :warning: Be careful when sharing logs. Review their contents before sharing them publicly.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24952: camel-seda - virtualThreadPerTask consumer stop waits for dispatched tasks that have not started [camel]

Posted by "gnodet-bot (via GitHub)" <gi...@apache.org>.
gnodet-bot commented on code in PR #26798:
URL: https://github.com/apache/camel/pull/26798#discussion_r4094399888


##########
core/camel-core/src/test/java/org/apache/camel/component/seda/ThreadPerTaskSedaConsumerStopTest.java:
##########
@@ -0,0 +1,153 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.seda;
+
+import java.util.List;
+import java.util.concurrent.AbstractExecutorService;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.support.DefaultThreadPoolFactory;
+import org.junit.jupiter.api.Test;
+
+import static org.awaitility.Awaitility.await;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * A graceful stop of a virtualThreadPerTask seda consumer must wait for an exchange that has been polled and
+ * dispatched, but whose task has not started running yet.
+ */
+class ThreadPerTaskSedaConsumerStopTest extends ContextTestSupport {
+
+    private final CountDownLatch dispatched = new CountDownLatch(1);
+    private final CountDownLatch startTask = new CountDownLatch(1);
+    private final CountDownLatch awaitingTermination = new CountDownLatch(1);
+
+    /**
+     * Task executor which delays the start of the tasks, until the test lets them start.
+     */
+    private final class DelayedStartExecutorService extends AbstractExecutorService {
+        private final ExecutorService delegate;
+
+        DelayedStartExecutorService(ExecutorService delegate) {
+            this.delegate = delegate;
+        }
+
+        @Override
+        public void execute(Runnable task) {
+            delegate.execute(() -> {
+                try {
+                    startTask.await(20, TimeUnit.SECONDS);
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                }
+                task.run();
+            });
+            dispatched.countDown();
+        }
+
+        @Override
+        public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
+            awaitingTermination.countDown();
+            return delegate.awaitTermination(timeout, unit);
+        }
+
+        @Override
+        public void shutdown() {
+            delegate.shutdown();
+        }
+
+        @Override
+        public List<Runnable> shutdownNow() {
+            return delegate.shutdownNow();
+        }
+
+        @Override
+        public boolean isShutdown() {
+            return delegate.isShutdown();
+        }
+
+        @Override
+        public boolean isTerminated() {
+            return delegate.isTerminated();
+        }
+    }
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+        context.getExecutorServiceManager().setThreadPoolFactory(new DefaultThreadPoolFactory() {
+            @Override
+            public ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
+                ExecutorService answer = super.newCachedThreadPool(threadFactory);
+                // the task executor of the thread-per-task seda consumer (its coordinator is a single thread executor)
+                if (threadFactory.newThread(() -> {
+                }).getName().endsWith("seda://v")) {
+                    answer = new DelayedStartExecutorService(answer);

Review Comment:
   ⚠️ **Wrong thread-name suffix — `DelayedStartExecutorService` is never installed.**
   
   `ThreadPerTaskSedaConsumer.setupTasks()` creates the task executor with:
   ```java
   newCachedThreadPool(this, getEndpoint().getEndpointUri() + "-task")
   ```
   For the route `seda:v`, the endpoint URI is `seda://v`, so the name passed to `CamelThreadFactory` is **`seda://v-task`**. The default Camel thread-name pattern then resolves to `"Camel Thread #N - seda://v-task"`. That string does **not** end with `"seda://v"` — the check is always false, the mock executor is silently skipped, and the test asserts on a route that uses the real unbounded executor, so `dispatched` is never signalled within 10 s and `assertTrue(dispatched.await(10, TimeUnit.SECONDS))` fails.
   
   Fix: match the actual suffix:
   ```suggestion
                   if (threadFactory.newThread(() -> {
                   }).getName().endsWith("seda://v-task")) {
   ```
   
   Also: calling `threadFactory.newThread(() -> {})` just to read the thread name creates a live (though unstarted) thread and silently increments `CamelThreadFactory`'s counter. The cleaner approach is to call `CamelThreadFactory.getName()` directly (the factory already exposes `getName()`), or to cast to `CamelThreadFactory` and read it without allocating a thread at all:
   ```java
   if (threadFactory instanceof CamelThreadFactory ctf && ctf.getName().endsWith("seda://v-task")) {
   ```
   This avoids the throwaway-thread side-effect and makes the intent explicit.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24952: camel-seda - virtualThreadPerTask consumer stop waits for dispatched tasks that have not started [camel]

Posted by "allthingssecurity (via GitHub)" <gi...@apache.org>.
allthingssecurity commented on code in PR #26798:
URL: https://github.com/apache/camel/pull/26798#discussion_r4094563199


##########
core/camel-core/src/test/java/org/apache/camel/component/seda/ThreadPerTaskSedaConsumerStopTest.java:
##########
@@ -0,0 +1,153 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.seda;
+
+import java.util.List;
+import java.util.concurrent.AbstractExecutorService;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.support.DefaultThreadPoolFactory;
+import org.junit.jupiter.api.Test;
+
+import static org.awaitility.Awaitility.await;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * A graceful stop of a virtualThreadPerTask seda consumer must wait for an exchange that has been polled and
+ * dispatched, but whose task has not started running yet.
+ */
+class ThreadPerTaskSedaConsumerStopTest extends ContextTestSupport {
+
+    private final CountDownLatch dispatched = new CountDownLatch(1);
+    private final CountDownLatch startTask = new CountDownLatch(1);
+    private final CountDownLatch awaitingTermination = new CountDownLatch(1);
+
+    /**
+     * Task executor which delays the start of the tasks, until the test lets them start.
+     */
+    private final class DelayedStartExecutorService extends AbstractExecutorService {
+        private final ExecutorService delegate;
+
+        DelayedStartExecutorService(ExecutorService delegate) {
+            this.delegate = delegate;
+        }
+
+        @Override
+        public void execute(Runnable task) {
+            delegate.execute(() -> {
+                try {
+                    startTask.await(20, TimeUnit.SECONDS);
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                }
+                task.run();
+            });
+            dispatched.countDown();
+        }
+
+        @Override
+        public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
+            awaitingTermination.countDown();
+            return delegate.awaitTermination(timeout, unit);
+        }
+
+        @Override
+        public void shutdown() {
+            delegate.shutdown();
+        }
+
+        @Override
+        public List<Runnable> shutdownNow() {
+            return delegate.shutdownNow();
+        }
+
+        @Override
+        public boolean isShutdown() {
+            return delegate.isShutdown();
+        }
+
+        @Override
+        public boolean isTerminated() {
+            return delegate.isTerminated();
+        }
+    }
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+        context.getExecutorServiceManager().setThreadPoolFactory(new DefaultThreadPoolFactory() {
+            @Override
+            public ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
+                ExecutorService answer = super.newCachedThreadPool(threadFactory);
+                // the task executor of the thread-per-task seda consumer (its coordinator is a single thread executor)
+                if (threadFactory.newThread(() -> {
+                }).getName().endsWith("seda://v")) {
+                    answer = new DelayedStartExecutorService(answer);

Review Comment:
   Thanks for checking this. I verified it, and the `DelayedStartExecutorService` *is* installed. `BaseExecutorServiceManager.newCachedThreadPool(source, name)` passes the name through `URISupport.sanitizeUri(name)`, which turns `seda://v-task` into `seda://v`. In a debug run that logged every cached pool the test's `ThreadPoolFactory` creates, there was exactly one, the consumer's task executor, and its thread name was `Camel (camel-1) thread #1 - seda://v`, which matched.
   
   The `dispatched` latch is only counted down by `DelayedStartExecutorService.execute`, so the test passing in about 0.5 s (rather than failing after the 10 s await) also shows it's in place. The test fails without the fix.
   
   I tried your cleaner variant (`threadFactory instanceof CamelThreadFactory ctf && ctf.getName().endsWith(...)`), but `getName()` doesn't return the sanitized name used in the thread name, so it didn't match and the test timed out. I kept the thread-name check. The thread it creates is never started and only exists inside the test's `ThreadPoolFactory`.
   
   _Claude Code on behalf of allthingssecurity_



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24952: camel-seda - virtualThreadPerTask consumer stop waits for dispatched tasks that have not started [camel]

Posted by "apupier (via GitHub)" <gi...@apache.org>.
apupier commented on code in PR #26798:
URL: https://github.com/apache/camel/pull/26798#discussion_r4094185755


##########
components/camel-seda/src/main/java/org/apache/camel/component/seda/ThreadPerTaskSedaConsumer.java:
##########
@@ -128,9 +128,24 @@ protected void afterPollEmpty() {
 
     @Override
     protected void processPolledExchange(Exchange exchange) {
+        // count the task when it is dispatched (not when it starts running), so a graceful shutdown
+        // also waits for polled exchanges whose task has not started yet
+        activeTasks.increment();
+        try {
+            dispatch(exchange);
+        } catch (RuntimeException e) {
+            // the task was not dispatched (e.g. rejected)
+            activeTasks.decrement();

Review Comment:
   shouldn't the decrement be safer if done in a finally block?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] CAMEL-24952: camel-seda - virtualThreadPerTask consumer stop waits for dispatched tasks that have not started [camel]

Posted by "gnodet (via GitHub)" <gi...@apache.org>.
gnodet commented on PR #26798:
URL: https://github.com/apache/camel/pull/26798#issuecomment-5874647625

   <!-- camel-backport-bot -->
   
   ### 🔄 Backport Bot
   
   This bugfix targets `main` and may need porting to:
   - `camel-4.22.x`
   
   Add a `port/<branch>` label to automatically create a backport PR for that branch.
   
   Backport PRs will be created automatically on merge (once a port label is added). Comment `/port` to create them immediately.
   
   ℹ️ If you push additional commits after `/port`, use `/port` again to update the port PRs.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org