Skip to content

Commit

Permalink
Merge pull request #869 from jobrunr/feature/quarkus-config-runtime
Browse files Browse the repository at this point in the history
[Quarkus] Separate build time and runtime configuration
  • Loading branch information
rdehuyss committed Nov 15, 2023
2 parents 7b69123 + 44963a1 commit 8511e91
Show file tree
Hide file tree
Showing 15 changed files with 259 additions and 200 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,7 @@
import org.jobrunr.jobs.lambdas.JobRequestHandler;
import org.jobrunr.jobs.states.*;
import org.jobrunr.quarkus.annotations.Recurring;
import org.jobrunr.quarkus.autoconfigure.JobRunrConfiguration;
import org.jobrunr.quarkus.autoconfigure.JobRunrProducer;
import org.jobrunr.quarkus.autoconfigure.JobRunrStarter;
import org.jobrunr.quarkus.autoconfigure.*;
import org.jobrunr.quarkus.autoconfigure.health.JobRunrHealthCheck;
import org.jobrunr.quarkus.autoconfigure.metrics.JobRunrMetricsProducer;
import org.jobrunr.quarkus.autoconfigure.metrics.JobRunrMetricsStarter;
Expand Down Expand Up @@ -79,12 +77,12 @@ FeatureBuildItem feature() {
}

@BuildStep
AdditionalBeanBuildItem produce(Capabilities capabilities, JobRunrConfiguration jobRunrConfiguration) {
AdditionalBeanBuildItem produce(Capabilities capabilities, JobRunrBuildTimeConfiguration jobRunrBuildTimeConfiguration) {
Set<Class<?>> additionalBeans = new HashSet<>();
additionalBeans.add(JobRunrProducer.class);
additionalBeans.add(JobRunrStarter.class);
additionalBeans.add(jsonMapper(capabilities));
additionalBeans.addAll(storageProvider(capabilities, jobRunrConfiguration));
additionalBeans.addAll(storageProvider(capabilities, jobRunrBuildTimeConfiguration));

return AdditionalBeanBuildItem.builder()
.setUnremovable()
Expand All @@ -93,14 +91,14 @@ AdditionalBeanBuildItem produce(Capabilities capabilities, JobRunrConfiguration
}

@BuildStep
AdditionalBeanBuildItem addMetrics(Optional<MetricsCapabilityBuildItem> metricsCapability, JobRunrConfiguration jobRunrConfiguration) {
AdditionalBeanBuildItem addMetrics(Optional<MetricsCapabilityBuildItem> metricsCapability, JobRunrBuildTimeConfiguration jobRunrBuildTimeConfiguration) {
if (metricsCapability.isPresent() && metricsCapability.get().metricsSupported(MetricsFactory.MICROMETER)) {
final AdditionalBeanBuildItem.Builder additionalBeanBuildItemBuilder = AdditionalBeanBuildItem.builder()
.setUnremovable()
.addBeanClasses(JobRunrMetricsStarter.class)
.addBeanClasses(JobRunrMetricsProducer.StorageProviderMetricsProducer.class);

if (jobRunrConfiguration.backgroundJobServer.enabled) {
if (jobRunrBuildTimeConfiguration.backgroundJobServer.enabled) {
additionalBeanBuildItemBuilder.addBeanClasses(JobRunrMetricsProducer.BackgroundJobServerMetricsProducer.class);
}
return additionalBeanBuildItemBuilder
Expand All @@ -111,16 +109,16 @@ AdditionalBeanBuildItem addMetrics(Optional<MetricsCapabilityBuildItem> metricsC

@BuildStep
@Record(ExecutionTime.RUNTIME_INIT)
void findRecurringJobAnnotationsAndScheduleThem(RecorderContext recorderContext, CombinedIndexBuildItem index, BeanContainerBuildItem beanContainer, JobRunrRecurringJobRecorder recorder, JobRunrConfiguration jobRunrConfiguration) throws NoSuchMethodException {
if (jobRunrConfiguration.jobScheduler.enabled) {
void findRecurringJobAnnotationsAndScheduleThem(RecorderContext recorderContext, CombinedIndexBuildItem index, BeanContainerBuildItem beanContainer, JobRunrRecurringJobRecorder recorder, JobRunrBuildTimeConfiguration jobRunrBuildTimeConfiguration) throws NoSuchMethodException {
if (jobRunrBuildTimeConfiguration.jobScheduler.enabled) {
new RecurringJobsFinder(recorderContext, index, beanContainer, recorder).findRecurringJobsAndScheduleThem();
}
}

@BuildStep
HealthBuildItem addHealthCheck(Capabilities capabilities, JobRunrConfiguration jobRunrConfiguration) {
HealthBuildItem addHealthCheck(Capabilities capabilities, JobRunrBuildTimeConfiguration jobRunrBuildTimeConfiguration) {
if (capabilities.isPresent(Capability.SMALLRYE_HEALTH)) {
return new HealthBuildItem(JobRunrHealthCheck.class.getName(), jobRunrConfiguration.healthEnabled);
return new HealthBuildItem(JobRunrHealthCheck.class.getName(), jobRunrBuildTimeConfiguration.healthEnabled);
}
return null;
}
Expand Down Expand Up @@ -172,13 +170,13 @@ void registerForReflection(
@BuildStep(onlyIf = NativeOrNativeSourcesBuild.class)
void registerStaticResources(
BuildProducer<NativeImageResourceDirectoryBuildItem> nativeImageResourceDirectoryProducer,
JobRunrConfiguration jobRunrConfiguration
JobRunrBuildTimeConfiguration jobRunrBuildTimeConfiguration
) {
if (jobRunrConfiguration.dashboard.enabled) {
if (jobRunrBuildTimeConfiguration.dashboard.enabled) {
nativeImageResourceDirectoryProducer.produce(new NativeImageResourceDirectoryBuildItem("org/jobrunr/dashboard/frontend/build"));
}

if ("sql".equalsIgnoreCase(jobRunrConfiguration.database.type.orElse(null))) {
if ("sql".equalsIgnoreCase(jobRunrBuildTimeConfiguration.database.type.orElse(null))) {
nativeImageResourceDirectoryProducer.produce(new NativeImageResourceDirectoryBuildItem("org/jobrunr/storage/sql"));
}
}
Expand Down Expand Up @@ -210,8 +208,8 @@ private Class<?> jsonMapper(Capabilities capabilities) {
throw new IllegalStateException("Either JSON-B or Jackson should be added via a Quarkus extension");
}

private Set<Class<?>> storageProvider(Capabilities capabilities, JobRunrConfiguration jobRunrConfiguration) {
String databaseType = jobRunrConfiguration.database.type.orElse(null);
private Set<Class<?>> storageProvider(Capabilities capabilities, JobRunrBuildTimeConfiguration jobRunrBuildTimeConfiguration) {
String databaseType = jobRunrBuildTimeConfiguration.database.type.orElse(null);
if ("sql".equalsIgnoreCase(databaseType) && !capabilities.isPresent(Capability.AGROAL)) {
throw new IllegalStateException("You configured 'sql' as a JobRunr Database Type but the AGROAL capability is not available");
} else if ("mongodb".equalsIgnoreCase(databaseType) && !capabilities.isPresent(Capability.MONGODB_CLIENT)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import io.quarkus.runtime.metrics.MetricsFactory;
import io.quarkus.smallrye.health.deployment.spi.HealthBuildItem;
import org.jboss.jandex.IndexView;
import org.jobrunr.quarkus.autoconfigure.JobRunrConfiguration;
import org.jobrunr.quarkus.autoconfigure.JobRunrBuildTimeConfiguration;
import org.jobrunr.quarkus.autoconfigure.JobRunrProducer;
import org.jobrunr.quarkus.autoconfigure.JobRunrStarter;
import org.jobrunr.quarkus.autoconfigure.health.JobRunrHealthCheck;
Expand All @@ -36,29 +36,29 @@ class JobRunrExtensionProcessorTest {
@Mock
Capabilities capabilities;

JobRunrConfiguration jobRunrConfiguration;
JobRunrBuildTimeConfiguration jobRunrBuildTimeConfiguration;

JobRunrConfiguration.BackgroundJobServerConfiguration backgroundJobServerConfiguration;
JobRunrBuildTimeConfiguration.BackgroundJobServerConfiguration backgroundJobServerConfiguration;

JobRunrConfiguration.DatabaseConfiguration databaseConfiguration;
JobRunrBuildTimeConfiguration.DatabaseConfiguration databaseConfiguration;

JobRunrExtensionProcessor jobRunrExtensionProcessor;

@BeforeEach
void setUpExtensionProcessor() {
jobRunrExtensionProcessor = new JobRunrExtensionProcessor();
jobRunrConfiguration = new JobRunrConfiguration();
backgroundJobServerConfiguration = new JobRunrConfiguration.BackgroundJobServerConfiguration();
jobRunrConfiguration.backgroundJobServer = backgroundJobServerConfiguration;
databaseConfiguration = new JobRunrConfiguration.DatabaseConfiguration();
jobRunrBuildTimeConfiguration = new JobRunrBuildTimeConfiguration();
backgroundJobServerConfiguration = new JobRunrBuildTimeConfiguration.BackgroundJobServerConfiguration();
jobRunrBuildTimeConfiguration.backgroundJobServer = backgroundJobServerConfiguration;
databaseConfiguration = new JobRunrBuildTimeConfiguration.DatabaseConfiguration();
databaseConfiguration.type = Optional.empty();
jobRunrConfiguration.database = databaseConfiguration;
jobRunrBuildTimeConfiguration.database = databaseConfiguration;
lenient().when(capabilities.isPresent(Capability.JSONB)).thenReturn(true);
}

@Test
void producesJobRunrProducer() {
final AdditionalBeanBuildItem additionalBeanBuildItem = jobRunrExtensionProcessor.produce(capabilities, jobRunrConfiguration);
final AdditionalBeanBuildItem additionalBeanBuildItem = jobRunrExtensionProcessor.produce(capabilities, jobRunrBuildTimeConfiguration);

assertThat(additionalBeanBuildItem.getBeanClasses())
.containsOnly(
Expand All @@ -77,10 +77,10 @@ void producesJobRunrRecurringJobsFinderIfJobSchedulerIsEnabled() throws NoSuchMe
BeanContainerBuildItem beanContainer = mock(BeanContainerBuildItem.class);
JobRunrRecurringJobRecorder recurringJobRecorder = mock(JobRunrRecurringJobRecorder.class);

jobRunrConfiguration.jobScheduler = new JobRunrConfiguration.JobSchedulerConfiguration();
jobRunrConfiguration.jobScheduler.enabled = true;
jobRunrBuildTimeConfiguration.jobScheduler = new JobRunrBuildTimeConfiguration.JobSchedulerConfiguration();
jobRunrBuildTimeConfiguration.jobScheduler.enabled = true;

jobRunrExtensionProcessor.findRecurringJobAnnotationsAndScheduleThem(recorderContext, combinedIndex, beanContainer, recurringJobRecorder, jobRunrConfiguration);
jobRunrExtensionProcessor.findRecurringJobAnnotationsAndScheduleThem(recorderContext, combinedIndex, beanContainer, recurringJobRecorder, jobRunrBuildTimeConfiguration);

verify(recorderContext, times(2)).registerNonDefaultConstructor(any(), any());
}
Expand All @@ -92,10 +92,10 @@ void producesNoJobRunrRecurringJobsFinderIfJobSchedulerIsNotEnabled() throws NoS
BeanContainerBuildItem beanContainer = mock(BeanContainerBuildItem.class);
JobRunrRecurringJobRecorder recurringJobRecorder = mock(JobRunrRecurringJobRecorder.class);

jobRunrConfiguration.jobScheduler = new JobRunrConfiguration.JobSchedulerConfiguration();
jobRunrConfiguration.jobScheduler.enabled = false;
jobRunrBuildTimeConfiguration.jobScheduler = new JobRunrBuildTimeConfiguration.JobSchedulerConfiguration();
jobRunrBuildTimeConfiguration.jobScheduler.enabled = false;

jobRunrExtensionProcessor.findRecurringJobAnnotationsAndScheduleThem(recorderContext, combinedIndex, beanContainer, recurringJobRecorder, jobRunrConfiguration);
jobRunrExtensionProcessor.findRecurringJobAnnotationsAndScheduleThem(recorderContext, combinedIndex, beanContainer, recurringJobRecorder, jobRunrBuildTimeConfiguration);

verifyNoInteractions(recorderContext);
}
Expand All @@ -104,7 +104,7 @@ void producesNoJobRunrRecurringJobsFinderIfJobSchedulerIsNotEnabled() throws NoS
void jobRunrProducerUsesJSONBIfCapabilityPresent() {
Mockito.reset(capabilities);
lenient().when(capabilities.isPresent(Capability.JSONB)).thenReturn(true);
final AdditionalBeanBuildItem additionalBeanBuildItem = jobRunrExtensionProcessor.produce(capabilities, jobRunrConfiguration);
final AdditionalBeanBuildItem additionalBeanBuildItem = jobRunrExtensionProcessor.produce(capabilities, jobRunrBuildTimeConfiguration);

assertThat(additionalBeanBuildItem.getBeanClasses())
.contains(JobRunrProducer.JobRunrJsonBJsonMapperProducer.class.getName());
Expand All @@ -114,7 +114,7 @@ void jobRunrProducerUsesJSONBIfCapabilityPresent() {
void jobRunrProducerUsesJacksonIfCapabilityPresent() {
Mockito.reset(capabilities);
lenient().when(capabilities.isPresent(Capability.JACKSON)).thenReturn(true);
final AdditionalBeanBuildItem additionalBeanBuildItem = jobRunrExtensionProcessor.produce(capabilities, jobRunrConfiguration);
final AdditionalBeanBuildItem additionalBeanBuildItem = jobRunrExtensionProcessor.produce(capabilities, jobRunrBuildTimeConfiguration);

assertThat(additionalBeanBuildItem.getBeanClasses())
.contains(JobRunrProducer.JobRunrJacksonJsonMapperProducer.class.getName());
Expand All @@ -123,7 +123,7 @@ void jobRunrProducerUsesJacksonIfCapabilityPresent() {
@Test
void jobRunrProducerUsesSqlStorageProviderIfAgroalCapabilityIsPresent() {
lenient().when(capabilities.isPresent(Capability.AGROAL)).thenReturn(true);
final AdditionalBeanBuildItem additionalBeanBuildItem = jobRunrExtensionProcessor.produce(capabilities, jobRunrConfiguration);
final AdditionalBeanBuildItem additionalBeanBuildItem = jobRunrExtensionProcessor.produce(capabilities, jobRunrBuildTimeConfiguration);

assertThat(additionalBeanBuildItem.getBeanClasses())
.contains(JobRunrSqlStorageProviderProducer.class.getName());
Expand All @@ -132,7 +132,7 @@ void jobRunrProducerUsesSqlStorageProviderIfAgroalCapabilityIsPresent() {
@Test
void jobRunrProducerUsesMongoDBStorageProviderIfMongoDBClientCapabilityIsPresent() {
lenient().when(capabilities.isPresent(Capability.MONGODB_CLIENT)).thenReturn(true);
final AdditionalBeanBuildItem additionalBeanBuildItem = jobRunrExtensionProcessor.produce(capabilities, jobRunrConfiguration);
final AdditionalBeanBuildItem additionalBeanBuildItem = jobRunrExtensionProcessor.produce(capabilities, jobRunrBuildTimeConfiguration);

assertThat(additionalBeanBuildItem.getBeanClasses())
.contains(JobRunrMongoDBStorageProviderProducer.class.getName())
Expand All @@ -143,7 +143,7 @@ void jobRunrProducerUsesMongoDBStorageProviderIfMongoDBClientCapabilityIsPresent
void jobRunrProducerUsesDocumentDBStorageProviderIfMongoDBClientCapabilityIsPresent() {
lenient().when(capabilities.isPresent(Capability.MONGODB_CLIENT)).thenReturn(true);
databaseConfiguration.type = Optional.of("documentdb");
final AdditionalBeanBuildItem additionalBeanBuildItem = jobRunrExtensionProcessor.produce(capabilities, jobRunrConfiguration);
final AdditionalBeanBuildItem additionalBeanBuildItem = jobRunrExtensionProcessor.produce(capabilities, jobRunrBuildTimeConfiguration);

assertThat(additionalBeanBuildItem.getBeanClasses())
.contains(JobRunrDocumentDBStorageProviderProducer.class.getName())
Expand All @@ -153,7 +153,7 @@ void jobRunrProducerUsesDocumentDBStorageProviderIfMongoDBClientCapabilityIsPres
@Test
void jobRunrProducerUsesElasticSearchStorageProviderIfElasticSearchRestHighLevelClientCapabilityIsPresent() {
lenient().when(capabilities.isPresent(Capability.ELASTICSEARCH_REST_HIGH_LEVEL_CLIENT)).thenReturn(true);
final AdditionalBeanBuildItem additionalBeanBuildItem = jobRunrExtensionProcessor.produce(capabilities, jobRunrConfiguration);
final AdditionalBeanBuildItem additionalBeanBuildItem = jobRunrExtensionProcessor.produce(capabilities, jobRunrBuildTimeConfiguration);

assertThat(additionalBeanBuildItem.getBeanClasses())
.contains(JobRunrElasticSearchStorageProviderProducer.class.getName());
Expand All @@ -162,7 +162,7 @@ void jobRunrProducerUsesElasticSearchStorageProviderIfElasticSearchRestHighLevel
@Test
void addHealthCheckAddsHealthBuildItemIfSmallRyeHealthCapabilityIsPresent() {
lenient().when(capabilities.isPresent(Capability.SMALLRYE_HEALTH)).thenReturn(true);
final HealthBuildItem healthBuildItem = jobRunrExtensionProcessor.addHealthCheck(capabilities, jobRunrConfiguration);
final HealthBuildItem healthBuildItem = jobRunrExtensionProcessor.addHealthCheck(capabilities, jobRunrBuildTimeConfiguration);

assertThat(healthBuildItem.getHealthCheckClass())
.isEqualTo(JobRunrHealthCheck.class.getName());
Expand All @@ -171,28 +171,28 @@ void addHealthCheckAddsHealthBuildItemIfSmallRyeHealthCapabilityIsPresent() {
@Test
void addHealthCheckDoesNotAddHealthBuildItemIfSmallRyeHealthCapabilityIsNotPresent() {
lenient().when(capabilities.isPresent(Capability.SMALLRYE_HEALTH)).thenReturn(false);
final HealthBuildItem healthBuildItem = jobRunrExtensionProcessor.addHealthCheck(capabilities, jobRunrConfiguration);
final HealthBuildItem healthBuildItem = jobRunrExtensionProcessor.addHealthCheck(capabilities, jobRunrBuildTimeConfiguration);

assertThat(healthBuildItem).isNull();
}

@Test
void addMetricsDoesNotAddMetricsIfNotEnabled() {
final AdditionalBeanBuildItem metricsBeanBuildItem = jobRunrExtensionProcessor.addMetrics(Optional.empty(), jobRunrConfiguration);
final AdditionalBeanBuildItem metricsBeanBuildItem = jobRunrExtensionProcessor.addMetrics(Optional.empty(), jobRunrBuildTimeConfiguration);

assertThat(metricsBeanBuildItem).isNull();
}

@Test
void addMetricsDoesNotAddMetricsIfEnabledButNoMicroMeterSupport() {
final AdditionalBeanBuildItem metricsBeanBuildItem = jobRunrExtensionProcessor.addMetrics(Optional.of(new MetricsCapabilityBuildItem(toSupport -> false)), jobRunrConfiguration);
final AdditionalBeanBuildItem metricsBeanBuildItem = jobRunrExtensionProcessor.addMetrics(Optional.of(new MetricsCapabilityBuildItem(toSupport -> false)), jobRunrBuildTimeConfiguration);

assertThat(metricsBeanBuildItem).isNull();
}

@Test
void addMetricsDoesAddStorageProviderMetricsIfEnabledAndMicroMeterSupport() {
final AdditionalBeanBuildItem metricsBeanBuildItem = jobRunrExtensionProcessor.addMetrics(Optional.of(new MetricsCapabilityBuildItem(toSupport -> toSupport.equals(MetricsFactory.MICROMETER))), jobRunrConfiguration);
final AdditionalBeanBuildItem metricsBeanBuildItem = jobRunrExtensionProcessor.addMetrics(Optional.of(new MetricsCapabilityBuildItem(toSupport -> toSupport.equals(MetricsFactory.MICROMETER))), jobRunrBuildTimeConfiguration);

assertThat(metricsBeanBuildItem.getBeanClasses())
.contains(JobRunrMetricsStarter.class.getName())
Expand All @@ -204,7 +204,7 @@ void addMetricsDoesAddStorageProviderMetricsIfEnabledAndMicroMeterSupport() {
void addMetricsDoesAddStorageProviderAndBackgroundJobServerMetricsIfEnabledAndMicroMeterSupport() {
backgroundJobServerConfiguration.enabled = true;

final AdditionalBeanBuildItem metricsBeanBuildItem = jobRunrExtensionProcessor.addMetrics(Optional.of(new MetricsCapabilityBuildItem(toSupport -> toSupport.equals(MetricsFactory.MICROMETER))), jobRunrConfiguration);
final AdditionalBeanBuildItem metricsBeanBuildItem = jobRunrExtensionProcessor.addMetrics(Optional.of(new MetricsCapabilityBuildItem(toSupport -> toSupport.equals(MetricsFactory.MICROMETER))), jobRunrBuildTimeConfiguration);

assertThat(metricsBeanBuildItem.getBeanClasses())
.contains(JobRunrMetricsStarter.class.getName())
Expand Down

0 comments on commit 8511e91

Please sign in to comment.