diff --git a/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskBatchRuntimeHints.java b/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskBatchRuntimeHints.java new file mode 100644 index 00000000..6cc230db --- /dev/null +++ b/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskBatchRuntimeHints.java @@ -0,0 +1,48 @@ +/* + * Copyright 2022-2022 the original author or authors. + * + * Licensed 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 + * + * https://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.springframework.cloud.task.batch.configuration; + +import org.springframework.aop.SpringProxy; +import org.springframework.aop.framework.Advised; +import org.springframework.aot.hint.RuntimeHints; +import org.springframework.aot.hint.RuntimeHintsRegistrar; +import org.springframework.aot.hint.TypeReference; +import org.springframework.core.DecoratingProxy; + +/** + * Native Hints for Spring Cloud Task Batch. + * + * To be removed when batch adds its hints. + * + * @author Glenn Renfro + * @since 3.0 + */ +public class TaskBatchRuntimeHints implements RuntimeHintsRegistrar { + + @Override + public void registerHints(RuntimeHints hints, ClassLoader classLoader) { + + hints.resources().registerPattern("org/springframework/batch/core/schema-h2.sql"); + + hints.proxies() + .registerJdkProxy(builder -> builder + .proxiedInterfaces(TypeReference.of("org.springframework.batch.core.repository.JobRepository")) + .proxiedInterfaces(SpringProxy.class, Advised.class, DecoratingProxy.class)); + + } + +} diff --git a/spring-cloud-task-batch/src/main/resources/META-INF/spring/aot.factories b/spring-cloud-task-batch/src/main/resources/META-INF/spring/aot.factories new file mode 100644 index 00000000..ea6f3846 --- /dev/null +++ b/spring-cloud-task-batch/src/main/resources/META-INF/spring/aot.factories @@ -0,0 +1,2 @@ +org.springframework.aot.hint.RuntimeHintsRegistrar=\ +org.springframework.cloud.task.batch.configuration.TaskBatchRuntimeHints diff --git a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/SimpleTaskAutoConfiguration.java b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/SimpleTaskAutoConfiguration.java index 413b5872..b7c9f260 100644 --- a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/SimpleTaskAutoConfiguration.java +++ b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/SimpleTaskAutoConfiguration.java @@ -33,6 +33,7 @@ import org.springframework.cloud.task.repository.TaskExplorer; import org.springframework.cloud.task.repository.TaskNameResolver; import org.springframework.cloud.task.repository.TaskRepository; import org.springframework.cloud.task.repository.support.SimpleTaskNameResolver; +import org.springframework.cloud.task.repository.support.SimpleTaskRepository; import org.springframework.cloud.task.repository.support.TaskRepositoryInitializer; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; @@ -80,8 +81,8 @@ public class SimpleTaskAutoConfiguration { private TaskExplorer taskExplorer; @Bean - public TaskRepository taskRepository() { - return this.taskRepository; + public SimpleTaskRepository taskRepository() { + return (SimpleTaskRepository) this.taskRepository; } @Bean diff --git a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/TaskRuntimeHints.java b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/TaskRuntimeHints.java index b10b6d7e..3c2e065b 100644 --- a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/TaskRuntimeHints.java +++ b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/TaskRuntimeHints.java @@ -24,9 +24,12 @@ import org.springframework.aot.hint.MemberCategory; import org.springframework.aot.hint.RuntimeHints; import org.springframework.aot.hint.RuntimeHintsRegistrar; import org.springframework.aot.hint.TypeReference; +import org.springframework.aot.hint.support.RuntimeHintsUtils; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.cloud.task.repository.TaskExplorer; import org.springframework.cloud.task.repository.TaskRepository; import org.springframework.core.DecoratingProxy; +import org.springframework.core.annotation.SynthesizedAnnotation; import org.springframework.util.ClassUtils; /** @@ -52,11 +55,16 @@ public class TaskRuntimeHints implements RuntimeHintsRegistrar { TypeReference.of("org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer"), hint -> hint.withMembers(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS, MemberCategory.INVOKE_DECLARED_METHODS)); + hints.proxies().registerJdkProxy(builder -> builder.proxiedInterfaces(TaskRepository.class) .proxiedInterfaces(SpringProxy.class, Advised.class, DecoratingProxy.class)); hints.proxies().registerJdkProxy(builder -> builder.proxiedInterfaces(TaskExplorer.class) .proxiedInterfaces(SpringProxy.class, Advised.class, DecoratingProxy.class)); + // Remove Qualifier hints once SCSt can be natively compiled. + hints.reflection().registerType(Qualifier.class, RuntimeHintsUtils.ANNOTATION_HINT); + hints.proxies().registerJdkProxy(Qualifier.class, SynthesizedAnnotation.class); + if (!ClassUtils.isPresent("com.zaxxer.hikari.HikariDataSource", classLoader)) { return; } diff --git a/spring-cloud-task-samples/task-events/pom.xml b/spring-cloud-task-samples/task-events/pom.xml index 1cda9907..2519c077 100644 --- a/spring-cloud-task-samples/task-events/pom.xml +++ b/spring-cloud-task-samples/task-events/pom.xml @@ -58,6 +58,10 @@ spring-boot-starter-test test + + com.h2database + h2 + diff --git a/spring-cloud-task-samples/task-events/src/main/resources/application.properties b/spring-cloud-task-samples/task-events/src/main/resources/application.properties index 62a3ed49..617cdddc 100644 --- a/spring-cloud-task-samples/task-events/src/main/resources/application.properties +++ b/spring-cloud-task-samples/task-events/src/main/resources/application.properties @@ -1,3 +1,4 @@ spring.application.name=Event Emitting Task logging.level.org.springframework.cloud.stream=DEBUG logging.level.org.springframework.cloud.task=DEBUG + diff --git a/spring-cloud-task-samples/timestamp/src/main/resources/application.properties b/spring-cloud-task-samples/timestamp/src/main/resources/application.properties index cba59d43..b9b3a7b6 100644 --- a/spring-cloud-task-samples/timestamp/src/main/resources/application.properties +++ b/spring-cloud-task-samples/timestamp/src/main/resources/application.properties @@ -1,4 +1,4 @@ spring.application.name=Demo Timestamp Task logging.level.org.springframework.cloud.task=DEBUG -spring.aop.proxy-target-class=false +#spring.aop.proxy-target-class=false