Skip to content

Commit bfa55cd

Browse files
authored
Make DAO initialization during startup with eager init (fixes #214) (#215)
1 parent 9a82b02 commit bfa55cd

File tree

2 files changed

+32
-22
lines changed

2 files changed

+32
-22
lines changed

changelog/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
This release is built against Quarkus 2.15.0.Final and the Cassandra driver 4.15.0.
44

5+
- [bug] [#214](https://github.com/datastax/cassandra-quarkus/issues/214) DAO initialization is not happening on main thread with eager init
6+
57
### 1.1.2
68

79
This release is built against Quarkus 2.7.1.Final and the Cassandra driver 4.14.0.

runtime/src/main/java/com/datastax/oss/quarkus/runtime/internal/quarkus/CassandraClientStarter.java

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,15 @@
1919
import com.datastax.oss.quarkus.runtime.api.mapper.QuarkusGeneratedDaoBean;
2020
import com.datastax.oss.quarkus.runtime.api.mapper.QuarkusGeneratedMapperBean;
2121
import com.datastax.oss.quarkus.runtime.api.session.QuarkusCqlSession;
22+
import io.quarkus.arc.ClientProxy;
2223
import io.quarkus.runtime.StartupEvent;
2324
import io.smallrye.mutiny.Uni;
2425
import java.time.Duration;
2526
import java.util.concurrent.CompletionStage;
2627
import java.util.concurrent.ExecutionException;
28+
import java.util.concurrent.ExecutorService;
29+
import java.util.concurrent.Executors;
30+
import java.util.concurrent.Future;
2731
import java.util.concurrent.TimeUnit;
2832
import java.util.concurrent.TimeoutException;
2933
import javax.enterprise.context.Dependent;
@@ -49,8 +53,6 @@ public class CassandraClientStarter {
4953
@Inject @QuarkusGeneratedMapperBean Instance<Object> mappers;
5054
@Inject @QuarkusGeneratedDaoBean Instance<Object> daos;
5155

52-
private Duration timeout;
53-
5456
@SuppressWarnings("unused")
5557
public void onStartup(@Observes StartupEvent event)
5658
throws ExecutionException, InterruptedException {
@@ -64,33 +66,39 @@ public void onStartup(@Observes StartupEvent event)
6466
}
6567
if (config.cassandraClientInitConfig.eagerInit) {
6668
LOG.info("Eagerly initializing Quarkus Cassandra client.");
67-
timeout = config.cassandraClientInitConfig.eagerInitTimeout;
68-
initializeBeans(sessions, "session");
69-
initializeBeans(mappers, "mapper");
70-
initializeBeans(daos, "DAO");
69+
Duration timeout = config.cassandraClientInitConfig.eagerInitTimeout;
70+
ExecutorService executor = Executors.newSingleThreadExecutor();
71+
Future<Void> initFuture =
72+
executor.submit(
73+
() -> {
74+
initializeBeans(sessions);
75+
initializeBeans(mappers);
76+
initializeBeans(daos);
77+
return null;
78+
});
79+
try {
80+
initFuture.get(timeout.toMillis(), TimeUnit.MILLISECONDS);
81+
} catch (TimeoutException e) {
82+
initFuture.cancel(true);
83+
LOG.warn(
84+
"Eager initialization of Quarkus Cassandra client did not complete within {}; "
85+
+ "resuming application startup with an uninitialized client.",
86+
timeout);
87+
}
88+
executor.shutdownNow();
7189
} else {
7290
LOG.debug(
7391
"Eager initialization of Quarkus Cassandra client at startup is disabled by configuration.");
7492
}
7593
}
7694

77-
private void initializeBeans(Instance<?> beans, String beanName)
78-
throws InterruptedException, ExecutionException {
95+
private void initializeBeans(Instance<?> beans) throws InterruptedException, ExecutionException {
7996
for (Object bean : beans) {
80-
try {
81-
if (bean instanceof CompletionStage) {
82-
((CompletionStage<?>) bean)
83-
.toCompletableFuture()
84-
.get(timeout.toNanos(), TimeUnit.NANOSECONDS);
85-
} else if (bean instanceof Uni) {
86-
((Uni<?>) bean).await().atMost(timeout);
87-
}
88-
} catch (TimeoutException | io.smallrye.mutiny.TimeoutException e) {
89-
LOG.warn(
90-
"Eager initialization of a {} bean did not complete within {}; "
91-
+ "resuming application startup with uninitialized bean.",
92-
beanName,
93-
timeout);
97+
ClientProxy.unwrap(bean);
98+
if (bean instanceof CompletionStage) {
99+
((CompletionStage<?>) bean).toCompletableFuture().get();
100+
} else if (bean instanceof Uni) {
101+
((Uni<?>) bean).await().indefinitely();
94102
}
95103
}
96104
}

0 commit comments

Comments
 (0)