Skip to content

bug: LC4J Parallel Agentics are hanging when calling twice on the same thread #237

@ricardozanini

Description

@ricardozanini

Pre-flight

  • I’m using the latest release or a recent snapshot.
  • I searched existing issues and Discussions.

What happened?

When running this IT on the LC4J Agentic Example:

void parallel_evening_planner_runs_all_branches() {
assertThat(eveningPlanner).isNotNull();
Agents.EveningPlan plan = eveningPlanner.plan("Toronto", Agents.Mood.ROMANTIC);
assertThat(plan).isNotNull();
assertThat(plan.dinner()).isNotBlank();
assertThat(plan.drinks()).isNotBlank();
assertThat(plan.activity()).isNotBlank();
plan = eveningPlanner.plan("New York", Agents.Mood.ROMANTIC);
assertThat(plan).isNotNull();
assertThat(plan.dinner()).isNotBlank();
assertThat(plan.drinks()).isNotBlank();
assertThat(plan.activity()).isNotBlank();
}

The second execution (New York) hangs.

Minimal reproducer

mvn clean install -DskipITs=false

Quarkus version

No response

quarkus-flow version

No response

Java version

No response

Runtime

None

Quarkus extensions in use

No response

Relevant logs/stack traces

2026-02-17 11:05:59,572 INFO  [io.quarkiverse.flow.langchain4j.workflow.FlowPlanner] (main) Building LC4J Workflow evening-planner-agent
2026-02-17 11:05:59,572 INFO  [io.quarkiverse.flow.internal.WorkflowRegistry] (main) Registering workflow evening-planner-agent
2026-02-17 11:05:59,572 WARN  [io.quarkiverse.flow.internal.WorkflowRegistry] (main) Duplicate workflow detected WorkflowDefinitionId[namespace=org.acme.langchain4j, name=evening-planner-agent, version=0.0.1]. Please remove the duplicate definition to prevent execution collisions or unexpected behavior during runtime.
2026-02-17 11:05:59,573 INFO  [io.quarkiverse.flow.tracing.TraceLoggerExecutionListener] (ForkJoinPool.commonPool-worker-7) Workflow name=evening-planner-agent instanceId=01KHP5KQHAZ2CD82CQXZ3N7JP8 started at 2026-02-17T11:05:59.573449-05:00 input=AgenticScope{memoryId='4500c9c0-8d5e-4d0b-b3bd-32e183003cca', state={mood=ROMANTIC, city=New York}}
2026-02-17 11:05:59,573 INFO  [io.quarkiverse.flow.tracing.TraceLoggerExecutionListener] (ForkJoinPool.commonPool-worker-7) Task 'parallel' started at 2026-02-17T11:05:59.573819-05:00 pos=do/0/parallel/branch
2026-02-17 11:05:59,574 INFO  [io.quarkiverse.flow.tracing.TraceLoggerExecutionListener] (pool-8-thread-1) Task 'dinner-planner-0-0' started at 2026-02-17T11:05:59.574093-05:00 pos=do/0/parallel/branch/0/dinner-planner-0-0
2026-02-17 11:05:59,574 INFO  [io.quarkiverse.flow.tracing.TraceLoggerExecutionListener] (pool-8-thread-4) Task 'activity-planner-2-2' started at 2026-02-17T11:05:59.574158-05:00 pos=do/0/parallel/branch/2/activity-planner-2-2
2026-02-17 11:05:59,574 DEBUG [io.quarkiverse.flow.langchain4j.workflow.FlowParallelAgentService] (pool-8-thread-4) Parallel execution of agent Activity planner$2 in branch activity-planner-2-2 started
2026-02-17 11:05:59,574 INFO  [io.quarkiverse.flow.tracing.TraceLoggerExecutionListener] (pool-8-thread-2) Task 'drinks-planner-1-1' started at 2026-02-17T11:05:59.574259-05:00 pos=do/0/parallel/branch/1/drinks-planner-1-1
2026-02-17 11:05:59,574 DEBUG [io.quarkiverse.flow.langchain4j.workflow.FlowParallelAgentService] (pool-8-thread-1) Parallel execution of agent Dinner planner$0 in branch dinner-planner-0-0 started
2026-02-17 11:05:59,574 DEBUG [io.quarkiverse.flow.langchain4j.workflow.FlowParallelAgentService] (pool-8-thread-2) Parallel execution of agent Drinks planner$1 in branch drinks-planner-1-1 started


# later:

Thread pool-8-thread-4: WAITING
  Waiting on java.util.concurrent.CompletableFuture$Signaller@119fecce
  Stack:
    java.base@17.0.14/jdk.internal.misc.Unsafe.park(Native Method)
    java.base@17.0.14/java.util.concurrent.locks.LockSupport.park(LockSupport.java:211)
    java.base@17.0.14/java.util.concurrent.CompletableFuture$Signaller.block(CompletableFuture.java:1864)
    java.base@17.0.14/java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3465)
    java.base@17.0.14/java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3436)
    java.base@17.0.14/java.util.concurrent.CompletableFuture.waitingGet(CompletableFuture.java:1898)
    java.base@17.0.14/java.util.concurrent.CompletableFuture.join(CompletableFuture.java:2117)
    io.quarkiverse.flow.langchain4j.workflow.FlowParallelAgentService.lambda$tasksDefinition$1(FlowParallelAgentService.java:63)
    io.quarkiverse.flow.langchain4j.workflow.FlowParallelAgentService$$Lambda$2861/0x0000009001c317c0.apply(Unknown Source)
    io.serverlessworkflow.impl.executors.func.JavaFunctionCallExecutor.callJavaFunction(JavaFunctionCallExecutor.java:35)
    io.serverlessworkflow.impl.executors.func.AbstractJavaCallExecutor.apply(AbstractJavaCallExecutor.java:42)
    io.serverlessworkflow.impl.executors.CallTaskExecutor.internalExecute(CallTaskExecutor.java:69)
    io.serverlessworkflow.impl.executors.RegularTaskExecutor.execute(RegularTaskExecutor.java:63)
    io.serverlessworkflow.impl.executors.AbstractTaskExecutor.lambda$apply$7(AbstractTaskExecutor.java:232)
    io.serverlessworkflow.impl.executors.AbstractTaskExecutor$$Lambda$2920/0x0000009001c6c6c8.apply(Unknown Source)
    java.base@17.0.14/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187)
    java.base@17.0.14/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2309)
    io.serverlessworkflow.impl.executors.AbstractTaskExecutor.apply(AbstractTaskExecutor.java:232)
    io.serverlessworkflow.impl.executors.ForkExecutor.lambda$internalExecute$0(ForkExecutor.java:78)
    io.serverlessworkflow.impl.executors.ForkExecutor$$Lambda$2921/0x0000009001c6c910.apply(Unknown Source)
    java.base@17.0.14/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1150)
    java.base@17.0.14/java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482)
    java.base@17.0.14/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    java.base@17.0.14/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    java.base@17.0.14/java.lang.Thread.run(Thread.java:840)

Metadata

Metadata

Assignees

Labels

Type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions